Hash 布鲁姆过滤器:如何找到k个散列函数?

Hash 布鲁姆过滤器:如何找到k个散列函数?,hash,bloom-filter,Hash,Bloom Filter,Bloom筛选器需要k个哈希函数,该函数返回0到m之间的值(m是位数组的长度)。 我必须实现这样一个bloom过滤器,我已经阅读了一些关于这些过滤器的理论论文(它们是如何工作的,需要多少散列函数,错误是如何表现的等等) 现在我有两个关于散列函数的问题: 如何找到k个散列函数-我应该使用哪些散列函数 如何查找返回值介于0和m之间的哈希函数?或者,如何将哈希函数的输出映射到范围0-m 您可以使用它-您可以使用加密哈希函数(如MD5或SHA)一次性获得一组哈希值。将加密散列值划分为Nm位片段,并像对

Bloom筛选器需要k个哈希函数,该函数返回0到m之间的值(m是位数组的长度)。 我必须实现这样一个bloom过滤器,我已经阅读了一些关于这些过滤器的理论论文(它们是如何工作的,需要多少散列函数,错误是如何表现的等等)

现在我有两个关于散列函数的问题:

  • 如何找到k个散列函数-我应该使用哪些散列函数
  • 如何查找返回值介于0和m之间的哈希函数?或者,如何将哈希函数的输出映射到范围0-m

您可以使用它-

您可以使用加密哈希函数(如MD5或SHA)一次性获得一组哈希值。将加密散列值划分为Nm位片段,并像对待N普通散列函数的输出一样对待它们。

  • 应该使用的k散列函数的特征是
    在维基百科页面上给出:并进入
    算法描述其中说明-设计k个不同独立哈希函数的要求

  • 有关通用哈希的良好教程:


    • U可以使用任何哈希函数……网络上有许多简单的哈希函数。 提及

      使用任何散列函数获取散列值,为了获取0-m范围内的散列值,请使用模数(%)运算符。 i、 e位位置=散列%m

      它可能效率不高,但很有效…

      您可以使用:

      其中,hash1是32位,hash2是32位。从外观上看,您可以使用:

      hash1 = upper 32 bit of a 64 bit hash
      hash2 = lower 32 bit of a 64 bit hash
      hash = hash1
      for(int i=0; i<k; i++) {
          hash += hash2
      }
      
      hash1=64位哈希的上32位
      hash2=64位哈希中较低的32位
      hash=hash1
      
      对于(int i=0;iSplitting),结果似乎是一个很好的建议,但对于散列驱动的数据结构,加密散列并不被认为是明智的选择,因为加密散列更多的是使返回输入变得困难,而不是性能良好。
      hash1 = upper 32 bit of a 64 bit hash
      hash2 = lower 32 bit of a 64 bit hash
      hash = hash1
      for(int i=0; i<k; i++) {
          hash += hash2
      }