我有关于为Bloom过滤器选择哈希函数的以下问题:
在几乎所有文档/论文中,您都可以读到布隆过滤器中使用的哈希函数应该是独立且均匀分布的。
我知道这是什么意思(独立且统一分布),但我很难找到论证或讨论,哪些散列函数满足这些要求,因此是合适的。在很多帖子中我都读过有关使用 FNV 或 Murmur哈希函数的建议,但不是为什么(或者至少没有证明)它们是合适的
提前致谢!
答案 0 :(得分:14)
在构建Java Bloom过滤器库时,我问自己同样的问题。有关我对Bloom过滤器的哈希函数分析的详细处理,请参阅the Github readme。
我从两个角度看问题:
可以通过随机输入的基准测量来轻松测量速度。统一性有点困难,需要一些统计数据。使用卡方拟合优度检验,我测量了散列值的分布与均匀分布的相似程度。
结果是:
如果您的实现使用Java,我建议使用我们的Bloom过滤器哈希库。它有详细记录并经过全面测试。有关详细信息,包括根据卡方检验的不同哈希函数的基准结果及其不一致性,请参阅Github readme of the repo。
答案 1 :(得分:5)
Hash Functions应该为您提供图形证明,说明为什么FNV将是一个糟糕的选择,以及为什么Murmur2或Bob Jenkins' Hashes之一将是一个不错的选择。
答案 2 :(得分:0)
我认为一个合理的选择是多个CRC哈希值。我假设,如果你想要多个n比特哈希值,那么对于具有布尔场系数的多项式,存在多个度数n + 1的素数多项式。但我不知道找到这些多项式的过程。
另一种可能性是使用多个模数哈希。 Bloom Filter位数组的大小必须是最大模数值。但我认为,为了使其运作良好,模数值必须是大于10的素数的乘积,并且相对相对质数。并且从最小模数值到最大模数值的范围必须尽可能小。我不知道如何找到这样的价值观。我编写了一些开源C ++代码,用于快速计算余数:https://github.com/wkaras/C-plus-plus-intrusive-container-templates/blob/master/modulus_hash.h