【发布时间】:2017-04-03 17:50:41
【问题描述】:
我听说 m 应该是 knuth 乘法哈希中的 2 的幂。否则,二的幂总是一个不错的选择。有人可以简单地告诉我为什么这样做更有效吗?
亲切的问候
【问题讨论】:
我听说 m 应该是 knuth 乘法哈希中的 2 的幂。否则,二的幂总是一个不错的选择。有人可以简单地告诉我为什么这样做更有效吗?
亲切的问候
【问题讨论】:
对于上下文,Knuth 乘法哈希的一般形式是这样的:
如果 w = 232 并且 M 是 2bits,那么这简化为
h(K) = A * K >> (32 - bits)
这显然非常好。诀窍是将除以 w 留待以后使用,使用mod w(这是自动的),然后从 top 中提取,但是如果以正常方式完成,我们会得到很多位(这对应于除以 w,按比例缩小 M,然后做地板 - 一次)。
但是这个技巧依赖于 w 和 M 是 2 的幂。如果 M 不是 2 的幂,则将有另一个定点乘法(而不仅仅是右移)来映射中间结果
[0 .. 232-1] 到 [0 .. M-1] 中,并且由于 M 不会将 232 相除,这也会在分布中引入偏差.
【讨论】: