Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我在这个bloom过滤器实现中做错了什么?_C++_C_Hash_Bitarray_Bloom Filter - Fatal编程技术网

C++ 我在这个bloom过滤器实现中做错了什么?

C++ 我在这个bloom过滤器实现中做错了什么?,c++,c,hash,bitarray,bloom-filter,C++,C,Hash,Bitarray,Bloom Filter,我有一个分段布卢姆过滤器的位表。这里,每一列都由一个散列函数管理 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}; 有行个哈希函数,

我有一个分段布卢姆过滤器的位表。这里,每一列都由一个散列函数管理

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};
个哈希函数,每个哈希函数处理列*8位的设置和检查

元素被散列,并且位索引计算为

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\u t i=0;i
问题是

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;
         }      
  }
for(std::size\u t i=0;i
我的问题是bloom过滤器很快就满了,我怀疑我没有正确使用字符的各个位。例如,我想我应该有如下内容:

bit_table_u[i][bit_index][bit]|=bit_掩码[bit]

但是,由于位_表被声明为二维数组,因此我不允许这样做

我应该如何使用char数组的各个位

英语是我的第二语言,所以你可能很难理解我的问题。如果有人要求,我很乐意进一步解释我的观点

编辑:
compute\u hash(i,set\u elemnt)使用预定义的salt值来计算要插入或查询的元素的哈希值。

计算索引方法中存在错误

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

你应该:

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

无关,但你的英语很好;只要把那些
i
修改成
i
insettion
修改成
insertion
,你就可以成为母语人士了。:)为什么要对过滤器中的每一行执行相同的位
读取和读取操作?@sarnold:真正的代码很长,所以我尽量简化。无论如何,请检查我的UpdateAnks是否试图简化事情——然而,
散列
在每次迭代中完全取决于
i
,而
compute\u index()
也完全取决于
i
的值——我有一种感觉,您的更新没有准确地反映您的代码所做的事情:/
bit\u索引
bit
是全局变量吗?