【问题标题】:Double hashing constant 5? [closed]双散列常数 5? [关闭]
【发布时间】:2012-12-20 13:46:12
【问题描述】:

我发现了大量的双重哈希示例,所有示例都告诉我,在第二次哈希时必须使用 %5。

我的问题是为什么是 5?是您始终使用 5 的协议还是它是如何工作的?

一个例子:https://www.cs.washington.edu/education/courses/326/00wi/handouts/lecture16/sld025.htm

【问题讨论】:

标签: java hash hashcode double-hashing


【解决方案1】:

在一个有N个地方的哈希表中,想法是使用两个独立的哈希函数h1(key)和h2(key),然后使用探测序列

h1 % N, (h1 + h2) % N, (h1 + 2*h2) % N, (h1 + 3*h2) % N, ...

您要确保 h2 和 N 的最大公约数为 1,否则您无法到达表中的所有位置。

有几种方案可以实现,例如:

  • 选择 N 作为素数,让 h2 在区间 [1, N-1] 中给出结果
  • 选择 N 作为 2 的幂,让 h2 给出区间 [1, N-1] 中的奇数

【讨论】:

  • 什么是 N?你能详细解释一下这个例子吗?
  • N是哈希表的大小,即数组元素的个数。在您在问题 N=7 中提到的示例中。
【解决方案2】:

没有。第二个散列函数可以是任何你想要的。理想情况下,它应该有平等的机会到达哈希数组的每个单元格。

我的猜测是您没有从其他来源查找任何双重哈希示例。为简单起见,您使用的来源决定多次使用% 5

【讨论】:

  • 你怎么知道第二个散列将能够到达每个单元格?
  • 这完全取决于您使用的key
【解决方案3】:

你并不总是使用 5,你甚至也不总是使用 %。

在你的例子中。 %7 和 %5 是您的散列函数。然而,实际上,它们可能是完全不同的功能。

此示例使用 %5,因为它对于示例来说足够简单。唯一真正的要求是这两个功能是独立的。

http://en.wikipedia.org/wiki/Double_hashing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2011-12-25
    • 2018-08-07
    相关资源
    最近更新 更多