【问题标题】:How many hash functions does my bloom filter need?我的布隆过滤器需要多少个哈希函数?
【发布时间】:2010-10-14 02:14:07
【问题描述】:

Wikipedia 说:

一个空的布隆过滤器是一个由 m 位组成的位数组,所有位都设置为 0。还必须定义 k 个不同的散列函数,每个散列函数将某个集合元素映射或散列到具有统一随机数的 m 个数组位置之一分布。

我看了文章,但我不明白的是k是如何确定的。它是表格大小的函数吗?

此外,在我编写的哈希表中,我使用了一种简单但有效的算法来自动增加哈希的大小。基本上,如果表中超过 50% 的桶被填满,我会将表的大小加倍。我怀疑您可能仍想使用布隆过滤器来减少误报。对吗?

【问题讨论】:

    标签: algorithm bloom-filter


    【解决方案1】:

    给定:

    • n:您希望过滤器中有多少项目(例如216,553
    • p:您可接受的误报率 {0..1}(例如 0.01 → 1%)

    我们要计算:

    • m:布隆过滤器所需的位数
    • k:我们应该应用的哈希函数的数量

    公式:

    m = -n*ln(p) / (ln(2)^2) 位数
    k = m/n * ln(2) 哈希函数的个数

    在我们的例子中:

    • m = -216553*ln(0.01) / (ln(2)^2) = 997263 / 0.48045 = 2,075,686 位 (253 kB)
    • k = m/n * ln(2) = 2075686/216553 * 0.693147 = 6.46 哈希函数(7 个哈希函数)

    注意:任何发布到公共领域的代码。无需署名。

    【讨论】:

    • 请注意,由于舍入/截断差异和/或对数函数的精度,如果您通过您选择的语言运行这些方程,您可能不会得到完全相同的数字。对我来说,m = 2075674k = 6.64。无论哪种方式,将两个值四舍五入到最接近的整数,您的误报率将足够接近。使用计算/四舍五入的mk 值重新计算p实际 值会很有趣。同样,不必担心有精确的值;球场已经足够好了。
    • 找到计算p 实际值的公式,给定一个计算的mk - 比较有趣的是,看看任何舍入可能如何影响您可接受的误报率。 e 是数学常数,而不是动态值。 p = e^(-(m / n) * (ln(2)^2)) - 感谢stackoverflow.com/a/24071581/2609094
    【解决方案2】:

    如果您进一步阅读Wikipedia article about Bloom filters,您会发现误报概率部分。本节说明哈希函数的数量如何影响误报的概率,并为您提供从所需的预期概率确定 k 的公式。误报。


    引自维基百科文章:

    显然,错误的概率 正数随着 m 减少(数量 数组中的位数)增加,并且 随着 n 增加(插入的数量 元素)增加。对于给定的 m 和 n,k的值(散列的个数 功能),最大限度地减少 概率是

    【讨论】:

      【解决方案3】:

      把它放在一张整洁的小桌子上:

      http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

      【讨论】:

        【解决方案4】:

        有一个很棒的online bloomfilter计算器。

        这款交互式布隆过滤器计算器可让您估算和找出满足布隆过滤器需求的系数。它还显示图表以直观地查看结果并提供所有公式 例如,计算 216,553 个n 项目,p 的概率为 0.01:

        n = ceil(m / (-k / log(1 - exp(log(p) / k))))
        p = pow(1 - exp(-k / (m / n)), k)
        m = ceil((n * log(p)) / log(1 / pow(2, log(2))));
        k = round((m / n) * log(2));
        

        【讨论】:

          【解决方案5】:

          给定您想要“投资”的每个密钥的位数,最好的 k 是:

          max(1, round(bitsPerKey * log(2)))
          

          其中max 是两者中的较大者,round 舍入到最接近的整数,log 是自然对数(以 e 为底)。

          【讨论】:

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