【问题标题】:How does Double Hashing work?双散列如何工作?
【发布时间】:2014-11-07 22:15:04
【问题描述】:

我正在阅读有关双重哈希以及如何将其与哈希表的开放寻址方案一起使用的信息。我理解开放寻址中的散列函数 h(k) 需要为给定键 k 生成探测序列的要求,使得探测序列是集合 的某种排列对于 m 个桶。线性探测通过使用函数增加探测计数来简单地做到这一点

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

双重哈希使用函数

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

以便探测以 i*h2(k) 的增量进行。

双重散列的建议是选择“m”作为 2 的幂,并始终从 h2(k) 返回一个奇数,以便这两个数互质。这如何保证探针序列是集合 的置换?

【问题讨论】:

  • Computer Science 上获得答案可能会更好。
  • 或 mathoverflow.net。但这里是快速的:m 是 2 的幂,k 是奇数,h、i 和 j 是整数,其中 j > i。假设h + i*k ==(mod m) h + j*k。从两边减去左边,我们得到0 ==(mod m) (j-i)*k,这相当于说(j-i)*k = c*m对于一些c。由于k 是奇数且m 是2 的幂,所以gcd(k,m) == 1,所以如果(j-i)*k = c*m,那么m 必须是j-i 的因子,这意味着@987654333 @ 至少是 m。 QED。

标签: algorithm data-structures hash double-hashing


【解决方案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. 选择 m 为 2 的幂,让 h2(k) 返回 [1,m-1] 中的奇数

【讨论】:

    【解决方案2】:

    第二部分的答案

    在双重哈希中,设哈希函数为 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 * h2(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) 只产生奇数有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多