对于哈希函数:h(k) = k mod m;
我知道m=2^n
将始终提供最后n
个LSB数字。我也理解m=2^p-1
当K是使用基数2^p
转换为整数的字符串时,将为K中的每个字符排列提供相同的哈希值。但为什么确切地说"素数不太接近精确的2"是个不错的选择?如果我选择2^p - 2
或2^p-3
怎么办?为什么这些选择被认为是错误的?
以下是CLRS的文字:
"一个不太接近2的精确幂的素数通常是m的一个好选择。对于 例如,假设我们希望分配一个哈希表,解决冲突 链接,大致保存n个2000字符串,其中一个字符有8位。 我们不介意在不成功的搜索中检查平均3个元素,并且 所以我们分配一个大小为m D 701的哈希表。我们可以选择m D 701因为 它是2000 = 3附近的素数,但不接近2的任何幂。"
答案 0 :(得分:0)
假设我们使用radix 2 p 。
为什么使用2 p -1是个坏主意?让我们看看,
k =Σa i 2 ip
如果我们除以2 p -1,我们就得到
k =Σa i 2 ip =Σa i mod 2 p -1
所以,由于加法是可交换的,我们可以置换数字并获得相同的结果。
来自CLRS的报价:
不太接近2的精确幂的素数通常是m的好选择。
k =Σa i 2 ip =Σa i b i mod 2 p -b
因此,将最低有效数字改为1会将哈希值改为1。将第二个最低有效位改为1会将哈希值改为2。要真正改变哈希,我们需要更改具有更大意义的数字。 因此,在小b的情况下,我们面临类似于案例的问题,那么m是2的幂,即我们依赖于最低有效数字的分布。