Bloom filter 只有一个输入哈希的bloom筛选器仍然是bloom筛选器吗?

Bloom filter 只有一个输入哈希的bloom筛选器仍然是bloom筛选器吗?,bloom-filter,Bloom Filter,如果我实现一个只使用一个散列算法(例如杂音)的bloom过滤器,这仍然被认为是bloom过滤器吗 例如,如果a散列为5,则将设置过滤器的第5位。如果b哈希为1,则将设置过滤器的第1位,依此类推 对于被视为bloom过滤器的东西,是否必须至少设置过滤器中的两位?如果只设置了一个位,它是否被称为其他位?它仍然是一个Bloom过滤器:一个具有k=1的过滤器。根据每个元素的位,它可能不是最节省空间的。但是,人们可能会选择一个不圆的k(bitsPerKey*log(2)),原因有很多,主要有: 为了能够

如果我实现一个只使用一个散列算法(例如杂音)的bloom过滤器,这仍然被认为是bloom过滤器吗

例如,如果
a
散列为
5
,则将设置过滤器的第5位。如果
b
哈希为
1
,则将设置过滤器的第1位,依此类推


对于被视为bloom过滤器的东西,是否必须至少设置过滤器中的两位?如果只设置了一个位,它是否被称为其他位?

它仍然是一个Bloom过滤器:一个具有
k=1
的过滤器。根据每个元素的位,它可能不是最节省空间的。但是,人们可能会选择一个不圆的
k
(bitsPerKey*log(2)),原因有很多,主要有:

  • 为了能够更好地压缩:这里最好使用
    k=1
    的Bloom过滤器。另见Michael Mitzenmacher的论文
  • 要加快查找和更新速度:使用较低的
    k
    会更快
顺便说一下,您仍然可以选择
k
作为最节省空间的函数,即使您只使用一个“应用程序哈希函数”(如64位的杂音哈希)。您只需选择“Bloom哈希函数”作为此“应用程序哈希函数”(64位杂音哈希)的函数,如下所示(假设
int
为32位,
long
为64位):

这实际上比计算多个“应用程序哈希函数”更简单、更快。从外观上看,这是这样的:

long m = murmur(x)
int hash = (int) (m >> 32);
int add = (int) m;
for (int i = 0; i < k; i++) {
    ... test / set the bit depending on "hash" ...
    hash += add;
}
long m=杂音(x)
int散列=(int)(m>>32);
int加=(int)m;
for(int i=0;i

许多Bloom filter库都是这样做的,例如Guava中的Bloom filter实现。

你应该说动机是什么(你想解决什么问题)。
long m = murmur(x)
int hash = (int) (m >> 32);
int add = (int) m;
for (int i = 0; i < k; i++) {
    ... test / set the bit depending on "hash" ...
    hash += add;
}