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