【发布时间】:2014-10-02 23:46:39
【问题描述】:
我试图将大约 6400 万个 64 位唯一无符号整数散列到 1.28 亿个桶(27 位宽地址)。我尝试了 Bob Jenkin 的 HashLittle 和 Murmur 哈希(这两个哈希函数都提供了 32 位哈希,我将其屏蔽以获得 27 位地址)。在这两种情况下,它导致了大约 22% 的碰撞,最终只占用了 37% 的存储桶。这是预期的还是我做错了什么?我期待更少的碰撞和更好的存储桶占用。
【问题讨论】:
-
而不是掩码 - 我假设你的意思是与 0x7FFFFFF 进行 AND'ing - 尝试取最大素数的模数
-
大多数著名的散列函数都是为散列短到中等长度的字符串而设计的。对于整数数据,值本身通常是最好的哈希值,而要将 64 位减少到 32 位,您可以使用混合函数,否则将用于聚合哈希值。
-
可能值得玩一下stackoverflow.com/questions/664014/… 中的一些哈希函数?
-
如果您使用的是 Intel,那么基于 CRC-32 的东西可能值得一试:
_mm_crc32_u32()。见stackoverflow.com/a/3045334/2809095。 -
有人可以提供一些关于设计混合功能的参考吗?
标签: c algorithm hash collision murmurhash