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的幂,也就是说,我们依赖于最低有效位数的分布