Hash 使用除法的散列

Hash 使用除法的散列,hash,Hash,对于散列函数:h(k)=k mod m 我知道m=2^n将始终给出最后的nLSB数字。我也明白,当K是一个使用基数转换为整数的字符串时,m=2^p-1将为K中的每个字符排列提供相同的哈希值。但是为什么确切地说“一个素数不太接近2的精确幂”是一个好的选择呢?如果我选择2^p-2或2^p-3?为什么这些选择被认为是不好的 以下是CLRS中的文本: 对于m来说,一个不太接近2的精确幂的素数通常是一个不错的选择 例如,假设我们希望分配一个哈希表,冲突由 链式,用来保存大约n个2000个字符串,其中一个字

对于散列函数:
h(k)=k mod m

我知道
m=2^n
将始终给出最后的
n
LSB数字。我也明白,当K是一个使用基数转换为整数的字符串时,
m=2^p-1
将为K中的每个字符排列提供相同的哈希值。但是为什么确切地说“一个素数不太接近2的精确幂”是一个好的选择呢?如果我选择
2^p-2
2^p-3
?为什么这些选择被认为是不好的

以下是CLRS中的文本:

对于m来说,一个不太接近2的精确幂的素数通常是一个不错的选择 例如,假设我们希望分配一个哈希表,冲突由 链式,用来保存大约n个2000个字符串,其中一个字符有8位。 我们不介意在不成功的搜索中检查平均3个元素,并且 所以我们分配一个大小为md701的哈希表 它是一个接近2000=3的素数,但不接近2的任何幂。”


假设我们使用基数2p

2p-1案例: 为什么使用2p-1是个坏主意?让我们看看

k=∑ai2ip

如果我们除以2p-1,我们得到

k=∑ai2ip=∑aimod 2p-1

所以,由于加法是可交换的,我们可以置换数字,得到相同的结果

2p-b案例: 引自CLRS:

对于m来说,一个不太接近2的精确幂的素数通常是一个很好的选择

k=∑ai2ip=∑aibimod 2p-b

因此,将最低有效位更改1将使哈希值更改1。将第二个最低有效位更改1将使哈希更改2。要真正改变散列,我们需要改变更重要的数字。所以,在小b的情况下,我们面临的问题类似于,m是2的幂,也就是说,我们依赖于最低有效位数的分布