我的布隆过滤器需要多少个哈希函数?

时间:2009-03-18 14:20:58

标签: algorithm bloom-filter

Wikipedia说:

  

空Bloom过滤器是m位的位数组,全部设置为0.还必须定义k个不同的散列函数,每个散列函数将一些set元素映射或散列到m个数组位置之一,并且随机均匀分布。

我读过这篇文章,但我不明白的是k是如何确定的。它是表大小的函数吗?

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

5 个答案:

答案 0 :(得分:44)

假设:

  • 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个哈希函数)
  

注意:任何已发布到公共领域的代码。无需归属。

答案 1 :(得分:17)

如果您在Wikipedia article about Bloom filters中进一步阅读,那么您会找到误报概率部分。本节介绍散列函数的数量如何影响误报的概率,并为您提供从期望的预期概率确定 k 的公式。误报。


来自维基百科的文章:

  显然,虚假的概率   正数减少为m(数字   数组中的位数增加,并且   增加为n(插入的数量)   元素)增加。对于给定的m和   n,k的值(散列数   函数)最小化   概率是

     

formula

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

有一个出色的online bloomfilter计算器。

此交互式布隆过滤器计算器使您可以估算和找出满足布隆过滤器需求的系数。它还显示了图形以可视方式查看结果并提供了所有公式  例如,以概率n为0.01的情况计算216,553个p项目:

enter image description here

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));

答案 4 :(得分:0)

给出每个要“投资”的密钥的位数,最好的k为:

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

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