我有这个位表用于分段布隆过滤器。这里每列都由一个哈希函数管理。
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_index 和位计算为
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)使用预定义的salt值来计算要插入或查询的元素的哈希值。
答案 0 :(得分:1)
您的compute_indices方法中存在错误。
您正在计算列索引,然后在此列索引上应用模8。最后,您将始终在列中使用相同的位。 例如,对于第10列,您将始终使用位2。
你应该:
compute_indices(unsigned int hash)
{
int bitIndex = hash % (COLUMNS * 8);
bit_index= bitIndex / 8;
bit = bitIndex % 8;
}