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