了解布隆过滤器

时间:2016-01-10 02:55:23

标签: c

我看了下面的例子: https://www.timdoug.com/etc/bloom_filter.c

尝试理解布隆过滤器

我接触到这部分代码,我无法理解:

for (i = 0; i < NUM_HASHES; i++) {
        /* xor-fold the hash into FILTER_SIZE bits */
        hash[i] = (hash[i] >> FILTER_SIZE) ^ 
                  (hash[i] & FILTER_BITMASK);
        /* set the bit in the filter */
        filter[hash[i] >> 3] |= 1 << (hash[i] & 7);
    }

这里究竟发生了什么以及为什么要执行(我理解运营商但我不明白为什么在这里使用它们)

1 个答案:

答案 0 :(得分:2)

对我来说,这部分算法看起来很麻烦(至少对于FILTER_SIZE意图自由选择的情况):假设FILTER_SIZE是10(而不是20)。然后,表达式(hash[i] >> FILTER_SIZE)可以给出22位(而不是12位)的结果,这将导致访问超出范围的过滤器。

现在解释:表达式的目的

hash[i] = (hash[i] >> FILTER_SIZE) ^ (hash[i] & FILTER_BITMASK);

是将hash [i]转换为有效的位索引(在^操作的帮助下加上一些随机化)。为了便于理解,让我们忽略使用^运算符(可以很容易地再添加)。然后,算法可以(更干净,并且希望正确地对所有FILTER_SIZE值)重写为:

for (i = 0; i < NUM_HASHES; ++i) {
    unsigned int bitIndex = hash[i] % (FILTER_SIZE_BYTES * 8);
    unsigned int byteIndex = bitIndex / 8;
    unsigned int bitInByte = bitIndex % 8;
    filter[byteIndex] |= (1 << bitInByte);
}