我正在运行Cuckoo过滤器存储库提供的示例的修改版本:https://github.com/efficient/cuckoofilter/blob/master/example/test.cc
我想在布谷鸟过滤器中添加字符串。虽然添加了字符串但是当我检查它是否存在于过滤器中时,它总是返回false。任何人都可以指出我的方法有什么问题吗?
size_t total_items = 1000000;
CuckooFilter<string, 12> filter(total_items);
// Insert items to this cuckoo filter
string temp1 = "sample";
if (filter.Add(temp1) != cuckoofilter::Ok) {
cout<<"not added"<<endl;
}
// Check if previously inserted items are in the filter
string temp2 = "sample";
assert(filter.Contain(temp2) == cuckoofilter::Ok);
断言应该是真的,但在这种情况下它是错误的。为什么呢?
答案 0 :(得分:1)
快速浏览一下https://github.com/efficient/cuckoofilter/blob/master/src/cuckoofilter.h#L65的来源,可以看出它使用了一个函数
inline void GenerateIndexTagHash(const ItemType &item, size_t* index, uint32_t* tag) const
{
std::string hashed_key = HashUtil::SHA1Hash(
(const char*) &item,
sizeof(item)
);
// ... rest is skipped for brevity
}
生成项目的初始索引和指纹(标记)。问题是散列实际对象已通过。为简化起见,它是这样做的:
// Your filter.Add(temp1) inside does this
HashUtil::SHA1Hash((const char*) &temp1, sizeof(temp1));
// Your filter.Contain(temp2) inside does this
HashUtil::SHA1Hash((const char*) &temp2, sizeof(temp2));
基本上,它会散列两个完全不同的对象,正如预期的那样,会产生不同的散列并映射到不同的存储桶。
要使它在你的情况下工作,它需要以散列实际字符串数据的方式调用 HashUtil :: SHA1Hash(),即:
// It should do something like this
HashUtil::SHA1Hash(
temp1.c_str(), // <-- notice we pass a pointer to an actual character data rather than a pointer to an instance of a std::string()
temp1.length()
);
HashUtil::SHA1Hash(
temp2.c_str(), // <-- notice we pass a pointer to an actual character data rather than a pointer to an instance of a std::string()
temp2.length()
);
这应该回答你的为什么?问题。至于
任何人都可以指出我的方法有什么问题吗?
您的方法本身并没有什么问题,因为图书馆不支持这样的用例,因为它可能无法正常工作。
答案 1 :(得分:-1)
我正在尝试将字符串添加到cuckoofilter库 https://github.com/efficient/cuckoofilter/blob/master/src/cuckoofilter.h
mycode
cuckoofilter::CuckooFilter<string, 12> cuckoo_mempool(total_items);
但是每次我运行代码时,我都会在线收到此错误 [https://github.com/ficient/cuckoofilter/blob/master/src/cuckoofilter.h#L68]
错误:对“(const cuckoofilter :: TwoIndependentMultiplyShift)(const std :: _ cxx11 :: basic_string&)的调用不匹配” 68 | const uint64_t hash = hasher (item); | ^ ~~~