我正在尝试编写我自己的使用 30 位散列的散列函数。
这是 FNVa 32 位哈希的一些代码。
func fnva32(data string) uint32 {
var hash uint32 = 2166136261
for _, c := range data {
hash ^= uint32(c)
hash *= 16777619
}
return hash
}
现在这是我将小写字母 a-z 转换为 30 位散列的代码:
func id(s string) uint {
var id uint
var power uint = 1
for _, c := range s {
id+=(uint(c)-96)*power
power*=26
}
return id%1073741824
}
这特别将我的哈希函数限制为最大 30 位,因为我正在对该数字使用模数。但是 FNVa32 哈希如何限制为 32 位?他们没有使用模数。它怎么不会生成比那个更大的数字?
您可能还注意到我没有使用质数。我尝试了一些素数,但它增加了碰撞。目前我得到 291 次冲突,FNVa32 得到 76 次冲突,来自哈希 600,000(真实)单词。
我的问题是……是什么让 FNVa32 限制为 32 位,我该如何将其更改为 30 位?
最佳答案
fnva32 函数的返回类型是 uint32,因此它无法返回包含更多位的答案。此外,该计算在内部使用了一个 uint32 变量。
关于hash - Go:这个散列函数的范围如何从 0-32 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891534/