【问题标题】:Which hash functions to use in a Bloom filter在布隆过滤器中使用哪些哈希函数
【发布时间】:2012-08-10 20:24:06
【问题描述】:

我有以下关于为 Bloom 过滤器选择哈希函数的问题:

  • 使用哪些函数?

在几乎所有文档/论文中,您都可以读到,布隆过滤器中使用的散列函数应该是独立且均匀分布的。

我知道这是什么意思(独立且均匀分布),但我很难找到论证或讨论,哪些哈希函数满足这些要求,因此是合适的。在很多帖子中,我读到了关于使用 FNVMurmur 散列函数 的建议,但不知道为什么(或至少没有证据)它们适合.

提前致谢!

【问题讨论】:

标签: function hash bloom-filter


【解决方案1】:

Hash Functions 应该为您提供图形证明,说明为什么 FNV 是一个糟糕的选择,以及为什么 Murmur2 或 Bob Jenkins' Hashes 之一是一个不错的选择。

【讨论】:

    【解决方案2】:

    在构建 Java Bloom 过滤器库时,我问过自己同样的问题。请参阅the Github readme,详细了解我对布隆过滤器哈希函数的分析。

    我从两个角度看待问题:

    • 计算速度有多快?
    • 输出分布有多均匀?

    速度可以很容易地通过随机输入的基准来衡量。均匀性有点困难,需要一些统计数据。使用卡方拟合优度测试,我测量了哈希值的分布与均匀分布的相似程度。

    结果是:

    • 使用 Murmur3 在速度和均匀性之间取得最佳平衡。 不要使用 Murmur2,因为它对于以小增量变化的输入并不统一。
    • 使用 加密哈希函数(如 SHA-256)以获得最佳一致性。
    • 应用Kirsch-Mitzenmacher-Optimization 仅计算 2 而不是 k 哈希函数 (hash_i = hash1 + i x hash2)。

    如果您的实现使用的是 Java,我建议您使用我们的 Bloom 过滤器哈希库。它有据可查并经过全面测试。详细信息,包括不同哈希函数的基准测试结果及其卡方检验的不均匀性,请参阅Github readme of the repo

    【讨论】:

    • 我没有仔细阅读Kirsch-Mitzenmacher-Optimization,但是在论文中hash_i = hash1 + ix hash2 % p,其中p是素数,hash1和hash2在[0,p-1]的范围内,并且位集由 k * p 位组成。
    • 模数是否仅在第二个哈希上?此外,Kirsch-Mitzenmacher-Optimization 有 2 个相同位的哈希,但在这种情况下,一个是 128 位,第二个是 256 位。这会导致偏见吗?
    • @TerenceChow 他们使用了一个并行分区布隆过滤器,其中包含 p 个元素的 k 个不同哈希表以及相关的 hash_i 函数。使用的总位数为 k * p。
    【解决方案3】:

    我认为一个合理的选择是多个 CRC 哈希。我假设,如果你想要多个 n 位哈希值,那么对于具有布尔域系数的多项式,有多个 n+1 次的素数多项式。但我不知道找到这些多项式的过程。

    另一种可能性是使用多个模哈希。布隆过滤器位数组的大小必须是最大模值。但我认为,要使其正常工作,模值必须是大于 10 的素数的乘积,并且彼此互为素数。并且从最小到最大模量值的范围必须尽可能小。我不知道找到这样的值的方法。我写了一些开源 C++ 代码来快速计算余数:https://github.com/wkaras/C-plus-plus-intrusive-container-templates/blob/master/modulus_hash.h

    【讨论】:

      猜你喜欢
      • 2014-11-10
      • 2018-07-21
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2011-09-30
      • 2019-04-27
      相关资源
      最近更新 更多