Double Hashing如何运作?

时间:2014-09-14 04:56:55

标签: algorithm data-structures hash double-hashing

我正在阅读关于双重散列以及它如何与散列表的开放寻址方案一起使用。我理解开放寻址中的散列函数h(k)需要为给定密钥k生成探测序列的要求,使得探测序列是集合的一些排列< 0,1,...,m-1> ;对于m桶。线性探测通过使用函数

递增探针计数来做到这一点
h(k,i) = (h1(k) + i) mod m

Double hashing使用函数

h(k,i) = (h1(k) + i*h2(k)) mod m

以便探测以i * h2(k)的增量发生。

双重哈希的建议是选择' m'作为2的幂并且总是从h2(k)返回奇数,使得这两个数是相对素数。这如何保证探针序列是集合< 0,1,...,m-1>的排列?

2 个答案:

答案 0 :(得分:1)

当且仅当h2(k)和m是相对质数时,探针序列到达所有位置。要看到这个,求解方程式

a + i * b = c     (mod m)

表示我:

i = (c - a) * inv(b)    (mod m)

b只有相对于m的相对素数才有反转。

实现这一目标的两个简单策略是

  1. 选择m为素数,让h2(k)返回[1,m-1]
  2. 中的值
  3. 选择m为2的幂,让h2(k)返回[1,m-1]中的奇数

答案 1 :(得分:0)

回答第二部分

在双重散列中,设散列函数为 h(k, i),其中 k 是键,i 是探测序列。

让 h(k, i) = h(k, j) 对于某些 i 和 j,其中 j > i。这意味着从第 i 步开始,经过 (j-i) 步之后,哈希函数指向同一个槽。 令 m 为表的大小。另外,h1(k) 和 h2(k) 是普通的哈希函数。

h(k, i) = h(k, j)
(h1(k) + i * h2(k)) mod m = (h1(k) + j * h< sub>2(k)) mod m
(i * h2(k)) mod m = (j * h2(k)) mod m
((j - i) * h2(k)) mod m = 0

由于h2(k) 和m 互质,因此(j - i) 必须是倍数或至少是m。因此,哈希函数要重复槽,步数必须至少为 m。

这证明保持 h2(k) 和 m 互质,双散列命中大小为 m 的表中的所有槽,产生 m 的所有排列。

因为奇数和2的幂是素数。使用 m = 2r 和 h2(k) 只产生奇数有效。