在布隆过滤器中过滤索引和哈希函数

时间:2014-09-16 16:25:20

标签: algorithm data-structures probability

Bloom过滤器使用m位的位数组,因此数组中有0到m-1个索引,但是散列函数I' m使用返回32位散列,因此它可以从0到(2) ^ 32)-1因为散列被用作位数组(过滤器)的索引,所以散列很可能大于m,因此该值不会映射到位数组上。我应该采用散列的mod,即散列%m ,以便生成的散列必须对应于位数组中的索引。它是否会增加误报的数量(IMO会)?

2 个答案:

答案 0 :(得分:1)

是的,使用mod会增加误报的可能性。 Stephan T. Lavavej在GoingNative 2013上有一个很好的讨论( mod 会产生偏见),见HERE

他还提到了(@btilly)所说的:简单地削减比特更好 - 如果你的哈希函数是好的那么它就可以了。

答案 1 :(得分:1)

散列函数h: S -> uint被宽松地定义为在集合S上表现出高度熵的散列函数。假设我有一个哈希函数h,其S上的熵非常高,但h(x)x的输出S始终是偶数。这种限制只是意味着h的一些输出被浪费,这只是位的1 / 32

现在假设我有一个Bloom过滤器,m是偶数。然后h(x) % m总是一个偶数 - 这意味着只会使用Bloom过滤器的一半位!这很糟糕!

正如其他人所建议的那样,只需将m的{​​{1}}位作为h(x)布隆过滤器区间的索引,这是一种更好的策略,因为假设您正在获得一个散列函数在集2^m上表现出高度的熵,“第一S位”散列函数m应该表现出几乎成比例的熵。