【问题标题】:what am i doing wrong in this bloom filter implementation?我在这个布隆过滤器实现中做错了什么?
【发布时间】:2012-05-12 11:03:21
【问题描述】:

我有一个分段布隆过滤器的位表。这里每一列都由一个哈希函数管理。

unsigned char bit_table_[ROWS][COLUMNS];//bit_table now have 8*ROWS*COLUMNS bits
unsigned char bit_mask[bits_per_char] = { 0x01,0x02,0x04,0x08,
                                          0x10,0x20,0x40,0x80};

ROWS 个散列函数,每个散列函数处理 COLUMNS*8 位的设置和检查。

元素经过哈希处理,bit_indexbit 计算为

compute_indices(unsigned int hash)
{
   bit_index=hash%COLUMNS;
   bit=bit_index%8;
}

现在插入完成为

for (std::size_t i = 0; i < ROWS; ++i)
      {
        hash=compute_hash(i,set_element);
        compute_indices(hash);
        bit_table_[i][bit_index ] |= bit_mask[bit]; 
      }

而查询是

for (std::size_t i = 0; i < ROWS; ++i)
      {
     hash=compute_hash(i,set_element);
      compute_indices(hash);

      if (((bit_table_[i][bit_index])& bit_mask[bit]) != bit_mask[bit])
         {
            return false;
         }      
  }

我的问题是布隆过滤器很快就满了,我怀疑我没有正确使用字符的各个位。例如,我想我应该有类似的东西:

bit_table_[i][bit_index][bit]|=bit_mask[bit];

用于插入,但由于 bit_table 被声明为二维数组,因此我不允许这样做。

我应该怎么做才能使用 char 数组的各个位?

英语是我的第二语言,所以您可能无法理解我的问题。如果需要,我很乐意进一步解释我的观点。

编辑: compute_hash(i,set_elemnt) 使用预定义的盐值来计算要插入或查询的元素的哈希值。

【问题讨论】:

  • 无关,但你的英语不错;只需将那些i 改成Iinsetion 改成insertion,你还不如成为母语人士。 :)
  • 你为什么在你的过滤器中对ROWS中的每一行做同样的ORing和读取?
  • @sarnold:真正的代码很长,所以我尽量让它简单。无论如何,请检查我的更新
  • 感谢您尝试简化事情——但是,hash 在每次迭代中仅取决于 icompute_indices() 也仅取决于 i 的值——我有感觉您的更新没有准确反映您的代码的功能。 ://
  • bit_indexbit 是全局变量吗?

标签: c++ c hash bitarray bloom-filter


【解决方案1】:

您的 compute_indices 方法中存在错误。

您正在计算列索引,然后对该列索引应用模 8。最后,您将始终在列中使用相同的位。 例如对于第 10 列,您将始终使用第 2 位。

你应该有:

compute_indices(unsigned int hash)
{
    int bitIndex = hash % (COLUMNS * 8);
    bit_index= bitIndex / 8;
    bit = bitIndex % 8;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2017-06-07
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多