hash - Go:这个散列函数的范围如何从 0-32 位?

标签 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 位?

最佳答案

fnva32 函数的返回类型是 uint32,因此它无法返回包含更多位的答案。此外,该计算在内部使用了一个 uint32 变量。

关于hash - Go:这个散列函数的范围如何从 0-32 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24891534/

相关文章:

perl - 不推荐使用散列作为引用

json - 解码 JSON,因为它仍在通过 net/http 流入

string - 使用需要转义的字符在 golang 中创建一个字符串

json - 如何使用无法在结构 : GOlang 中捕获为 `json` 的动态 key 解码 jSON

go - 错误处理中间件 - 将 err 转换为字符串以进行响应

Guava 版本之间的哈希问题

sql-server - 为什么这些日期时间值返回相同的 Checksum 和 Checksum_Agg?怎样才能让它更加独特呢?

docker - 进行dockerized构建,缓存依赖项拉取层

asp.net-mvc - 在 Route、ASP.net MVC 中获取当前片段

java - 哈希(带有 Spring)和盐 : is this safe?