Hash 如何在Go中生成字符串的哈希数?

Hash 如何在Go中生成字符串的哈希数?,hash,go,Hash,Go,例如: hash("HelloWorld") = 1234567 是否有任何内置函数可以做到这一点 谢谢。该软件包对此很有帮助。注意,它是对特定哈希实现的抽象。包装中有一些现成的 例如: package main import ( "fmt" "hash/fnv" ) func hash(s string) uint32 { h := fnv.New32a() h.Write([]byte(s)) return

例如:

hash("HelloWorld") = 1234567
是否有任何内置函数可以做到这一点

谢谢。

该软件包对此很有帮助。注意,它是对特定哈希实现的抽象。包装中有一些现成的

例如:

package main

import (
        "fmt"
        "hash/fnv"
)

func hash(s string) uint32 {
        h := fnv.New32a()
        h.Write([]byte(s))
        return h.Sum32()
}

func main() {
        fmt.Println(hash("HelloWorld"))
        fmt.Println(hash("HelloWorld."))
}
(还)


输出:

926844193
107706013

下面是一个可用于生成哈希数的函数:

// FNV32a hashes using fnv32a algorithm
func FNV32a(text string) uint32 {
    algorithm := fnv.New32a()
    algorithm.Write([]byte(text))
    return algorithm.Sum32()
}
我在这里组合了一组实用程序哈希函数:


你会发现
FNV32
FNV32a
FNV64
FNV64a
MD5
SHA1
SHA256
SHA512
,这些都不是具体的,而是有趣的和相关的:从理论上讲,这就是所谓的预灰烬,可以使用单个实例和
写入
/
重置
,而不是每次都创建
New32a
。我不知道要花多少钱。例如:这些哈希值是唯一的吗?我可以用它作为唯一的标识符吗?这些散列不是唯一的。两个不同字符串匹配同一uint32的可能性约为10到40亿。我不会因为它的独特性而使用它。下面是一个可能更有用的示例:每个任务都有一个唯一的“字符串”,我希望在50个队列之间均匀分布任务。我会(使用上述函数)散列(“HelloWorld”)%50。@我将每个散列函数都绑定到一个较小的空间中(就像任意长度的字符串绑定到uint32中)保证会有冲突,因此“我发现了一个特定的冲突”不是一个判断方法好坏的参数。如果您分析了该方法,发现冲突率高、分布不均匀或其他一些有意义的缺陷,这将是一个令人信服的论点,但我认为FNV已经存在这种分析。@IvanBlack我想知道在每次调用getHash时使用相同的New32a实例时并发性和竞争条件问题。在我看来,两个同时进行的getHash函数调用可能会以某种方式交错,导致其中一个在执行求和调用之前重置另一个的写操作,从而得到您不想要的结果。