如何在布谷鸟过滤器中添加字符串?

时间:2016-11-10 20:43:42

标签: c++ hash hashmap

我正在运行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);

断言应该是真的,但在这种情况下它是错误的。为什么呢?

2 个答案:

答案 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); | ^ ~~~