-1
为什么不能通过权力的2或权力的10或素数是好的散列函数?如果我们想要在一个散列函数中存储溢出记录,为什么这些散列函数选择不好?Hashing谷歌面试
为什么不能通过权力的2或权力的10或素数是好的散列函数?如果我们想要在一个散列函数中存储溢出记录,为什么这些散列函数选择不好?Hashing谷歌面试
假设你的散列函数返回一个32位无符号结果。假设你选择了一个4096的模数。你所做的实际上是:index = hash & 0xFFF
- 所以,你丢掉了哈希值的前20位。现在,如果你的散列值是真的好,最低的12位和其余的一样好,那么这不是问题。然而,如果你的哈希值在所有32位上都很好,但是最低的12位值是可疑的(例如,它们可能受到字符串最后一个字符的影响更大)......那么你可能会后悔舍弃前20位在这种情况下,如果选择任何奇数模数,则index = hash % modulus
的结果取决于散列的所有32位。
所以,更一般地,如果你的散列计算模M
,你的指数被视为hash % N
,那么你要的是你的M
和N
进行互质。
M
如果是2^m
(因为它通常是这样),那么N=10^n
是不好的选择,因为所得index
底部n
位是散列的底部n
比特的直副本。
数字本身很好,是一个数字,而不是散列函数。你能提供更多的上下文吗?也许为你的散列函数写一个公式? – mvp 2014-09-21 07:03:31
我想你的意思是使用2和10的幂数,质数作为模数?海湾合作委员会的实施使用主要模数 - 模数只是根据所需的桶数继续增加。 – Pradhan 2014-09-21 07:03:53
完全正确,如模数。为什么不选择2,10和幂数的幂作为哈希函数的模数产生最佳的内存管理结果? – Shrerocx 2014-09-21 07:08:57