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