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函数调用可能会以某种方式交错,导致其中一个在执行求和调用之前重置另一个的写操作,从而得到您不想要的结果。