【问题标题】:Creating Independent Hash Functions [duplicate]创建独立散列函数 [重复]
【发布时间】:2018-12-29 20:53:08
【问题描述】:

我需要创建两个独立的哈希函数来在java中实现一个布隆过滤器。

这两个哈希函数 h_1(x) 和 h_2(x) 将用于在需要时模拟额外的哈希函数。

我了解如何创建这样的基本哈希函数:

散列函数h(x) = x mod M,其中M代表散列表大小,是一个素数。

给定一个包含字符 c_i 的字符串 x : x c_1, c_2, ... , c_n, x = c_1.c_2.c_3...c_n (. 表示连接)

每个字符将被转换为 ASCII 码 E{0, .. ,127},然后在此处为每个字符乘以不同的常数 128^n-1 到 128^0。

这样包含不同顺序的相同字符的字符串不会散列到相同的值。

x = c_1*128^n-1 + c_2*128^n-2 + ... + c_n*128^0

如何创建独立于这个的第二个哈希函数?

改变常数就足够了吗?

如何验证它们确实是独立的?

【问题讨论】:

  • 我认为这里的“独立”是指一个人不调用另一个人。
  • 你能解释一下“独立”是什么意思吗?要提出一个直截了当的答案,请使用multiple available 中的任意两个哈希函数。
  • @displayName 我在 Reddit 上问过同样的问题,有人告诉我,函数在定义上是独立的。如果这是正确的,我认为这仅意味着两个不同的哈希函数,在这种情况下,您的提议似乎是正确的。
  • stackoverflow.com/a/24685697/56778。当我使用 Bloom 过滤器时,这种技术效果很好。
  • 请创建问题的MVCE,以便其他人可以最好地帮助您。

标签: java data-structures hash bloom-filter


【解决方案1】:

快速布隆过滤器实现通常不使用两个完全独立的哈希函数。相反,它使用一个好的散列函数返回足够的位,并从中创建多个散列值。例如:使用 Murmur3 哈希创建一个 128 位的哈希值。由此,使用低 64 位和高 64 位,如下所示:

h(x) = (higher + x * lower) mod M

这就是Google Guava Bloom filter implementation 当前的工作方式。

M 在实践中不一定需要是质数,即使认为它没有害处。 (理论上应该是一个。)

关于缩减步骤:mod M 可以替换为multiply and shift

您的哈希函数使用128^n。使用像 Murmur 3 这样众所周知的哈希函数可能会好得多。

【讨论】:

    猜你喜欢
    • 2012-08-20
    • 2018-11-30
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多