【问题标题】:Is a bloom filter with only one input hash still a bloom filter?只有一个输入哈希的布隆过滤器仍然是布隆过滤器吗?
【发布时间】:2019-04-27 15:39:03
【问题描述】:

如果我实现一个布隆过滤器,其中只使用一种散列算法(例如杂音),这是否仍被视为布隆过滤器?

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

对于被视为布隆过滤器的东西,是否必须设置过滤器中的至少两个位?如果只设置了一个位,是不是叫别的?

【问题讨论】:

  • 你应该说动机是什么(你想解决什么问题)。

标签: bloom-filter


【解决方案1】:

它仍然是一个布隆过滤器:一个带有k=1 的过滤器。根据每个元素的位数,它可能不是最节省空间的一种。但是有多种原因可以选择k 而不是round(bitsPerKey * log(2)),主要是:

  • 为了能够更好地压缩:这里最好使用带有k=1 的布隆过滤器。另请参阅 Michael Mitzenmacher 的论文 "Compressed Bloom Filters"
  • 加快查找和更新速度:使用较低的k 更快。

顺便说一句,您仍然可以选择k 作为最节省空间的一个,即使您只使用一个“应用程序哈希函数”(例如 64 位的 Murmur 哈希)。您只需选择“Bloom 哈希函数”作为此“应用程序哈希函数”(64 位 Murmur 哈希)的函数,就像这样(假设 int 是 32 位,long 是 64 位):

long m = murmur(x)
h(x, i) = (int) (m >> 32) + i * (int) m 

这实际上比计算多个“应用程序哈希函数”更容易。一看,是这样的:

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;
}

许多布隆过滤器库都是这样做的,例如 Guava 中的布隆过滤器实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多