我试图编写自己的使用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位?
答案 0 :(得分:2)
fnva32函数的返回类型是uint32,所以它无法返回更多位的答案。此外,计算在内部使用uint32变量。