【发布时间】:2014-10-17 21:09:28
【问题描述】:
我正在实现一个哈希表,它应该存储成对的 32 位值。考虑到我的元素是固定大小的,我使用了一个非常简单的散列函数:
hash(a,b) = asUint64(a) + (asUint64(b) << 32)
这样,我得到哈希表(即其对应的桶)中元素的索引:
index(a,b) = hash(a,b) % hash_size
其中 hash_size 是我表上的条目/存储桶数。不过,我已经意识到,如果我用 bitwise mod of 2 替换“模数”运算符,通过将 hash_size 固定为 2 的幂,我可以稍微加快这个实现。除了,当我这样做时,我的大多数配对最终都在第一个桶上!为什么会发生这种情况?
【问题讨论】:
-
如果你使用 2 的幂进行修改,你将破坏
b中存在的大量数据,并且可能会破坏a。 -
我想这听起来很合理,但为什么呢?
-
奇怪的是,你说你的大多数配对最终都在第一个桶上。我预计与此方案会发生更多冲突,但我怀疑您的情况更多是由于您的数据分布所致。
-
使用 MurmurHash3 avalanche 函数重新散列哈希并继续使用 2 大小的幂。
-
你也可以找到this answer有用
标签: math hash language-agnostic hashtable bit-manipulation