从密钥的哈希码计算哈希表桶索引时,为什么当桶的数组大小为2的幂时,我们避免在除法后使用余数(模数)?
答案 0 :(得分:5)
在计算哈希时,您需要尽可能多的信息,以便在整个比特范围内以良好的分布方式进行廉价处理:例如32位无符号整数通常很好,除非你有很多(> 30亿)项目存储在哈希表中。
它正在将哈希代码转换为您真正感兴趣的存储桶索引。当存储桶数量为2的幂时,您需要做的就是在哈希码h和(n-)之间执行AND运算1),结果等于h mod n。
这可能是坏的原因是AND操作只是从哈希码中丢弃比特 - 高级比特。这可能是好的也可能是坏的,取决于其他事情。一方面,它会非常快,因为AND比分区快得多(并且是你选择使用2个数量的桶的通常原因),但另一方面,糟糕的散列函数可能有较低位的熵较差:也就是说,当散列数据发生变化时,较低位的变化不大。
答案 1 :(得分:0)
我们说表格大小是m = 2 ^ p。 让k成为关键。 然后,每当我们做k mod m时,我们只得到k的二进制表示的最后p位。因此,如果我放入几个具有相同最后p位的键,则散列函数将执行非常非常糟糕,因为所有键将被散列到表中的相同插槽。因此,避免2的权力