其中散列函数在布隆过滤器使用(Which hash functions to use in a Bl

2019-06-27 00:46发布

我已经得到了有关选择散列函数布鲁姆过滤以下问题:

  • 哪些功能可以使用?

在几乎所有的文件/文件,你可以读到,在布隆过滤器中使用的散列函数应该是独立的,均匀分布。

我知道什么是本(独立和均匀分布)的意思,但我无法找到一个论证或讨论,这散列函数满足这些要求,因此适合。 在很多帖子我读过有关的FNV杂音哈希函数的使用建议,然而不知其所以然(或至少没有证据),他们是适合的。

提前致谢!

Answer 1:

构建Java布隆过滤器库时,我问自己同样的问题。 见GitHub的自述我的布卢姆过滤杂凑函数分析的详细处理。

我看着这个问题从两个方面:

  • 如何快速的计算?
  • 如何统一是输出分配?

速度可以很容易地通过对随机输入的基准进行测量。 一致性是有点困难,需要一些统计数据。 的拟合检验采用卡方善良我测的散列值的分布是多么相似的均匀分布。

其结果是:

  • 使用Murmur3速度和均匀性之间的最佳平衡点。 因为它是不统一的,在小的增量改变输入不要使用Murmur2。
  • 像使用SHA-256 加密散列函数的最佳均匀性。
  • 应用基尔希-Mitzenmacher-优化只计算2代替k个散列函数(HASH_I = HASH1 + 1X HASH2)。

如果你的实现是使用Java我会建议使用我们的布隆过滤器散列库。 这是有据可查的和彻底的测试。 有关详情,其中包括根据卡方检验不同的Hash函数及其unformity的基准测试结果,看到了回购的Github上的自述 。



Answer 2:

散列函数应该为你提供的FNV为什么会是一个不错的选择图形证明,为什么Murmur2或之一鲍勃·詹金斯的哈希值将是一个不错的选择。



Answer 3:

我认为,一个合理的选择是将多个CRC哈希值。 我假设,如果你想多n位的散列值,然后用布尔字段系数多项式,有度的n + 1的多个主要多项式。 但我不知道寻找这些多项式的过程中。

另一种可能性是使用多模哈希值。 布隆过滤器位阵列的大小就必须是最大的模值。 但我认为,它的工作好,模量值必须是素数大于10,且相对两两互素的产品。 和从最小到最大模量值的范围将必须是尽可能小。 我不知道的方式找到这样的值。 我已经写了余数的快速计算一些开源C ++代码: https://github.com/wkaras/C-plus-plus-intrusive-container-templates/blob/master/modulus_hash.h



文章来源: Which hash functions to use in a Bloom filter