使用除法方法进行哈希处理

时间:2017-05-30 19:48:26

标签: hash

对于哈希函数:h(k) = k mod m;

我知道m=2^n将始终提供最后n个LSB数字。我也理解m=2^p-1当K是使用基数2^p转换为整数的字符串时,将为K中的每个字符排列提供相同的哈希值。但为什么确切地说"素数不太接近精确的2"是个不错的选择?如果我选择2^p - 22^p-3怎么办?为什么这些选择被认为是错误的?

以下是CLRS的文字:

  

"一个不太接近2的精确幂的素数通常是m的一个好选择。对于   例如,假设我们希望分配一个哈希表,解决冲突   链接,大致保存n个2000字符串,其中一个字符有8位。   我们不介意在不成功的搜索中检查平均3个元素,并且   所以我们分配一个大小为m D 701的哈希表。我们可以选择m D 701因为   它是2000 = 3附近的素数,但不接近2的任何幂。"

1 个答案:

答案 0 :(得分:0)

假设我们使用radix 2 p

2 p -1案例:

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

k =Σa i 2 ip

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

k =Σa i 2 ip =Σa i mod 2 p -1

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

2 p -b case:

来自CLRS的报价:

  

不太接近2的精确幂的素数通常是m的好选择。

k =Σa i 2 ip =Σa i b i mod 2 p -b

因此,将最低有效数字改为1会将哈希值改为1。将第二个最低有效位改为1会将哈希值改为2。要真正改变哈希,我们需要更改具有更大意义的数字。 因此,在小b的情况下,我们面临类似于案例的问题,那么m是2的幂,即我们依赖于最低有效数字的分布。