gpt4 book ai didi

c++ - 我在这个布隆过滤器实现中做错了什么?

转载 作者:太空狗 更新时间:2023-10-29 23:08:11 27 4
gpt4 key购买 nike

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

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)使用预定义的盐值来计算要插入或查询的元素的哈希值。

最佳答案

您的 compute_indices 方法有错误。

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

你应该有:

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

关于c++ - 我在这个布隆过滤器实现中做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10422783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com