Go:这个哈希函数的范围是0-32位?

时间:2014-07-22 15:28:49

标签: hash go

我试图编写自己的使用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位?

1 个答案:

答案 0 :(得分:2)

fnva32函数的返回类型是uint32,所以它无法返回更多位的答案。此外,计算在内部使用uint32变量。