【发布时间】:2017-04-21 15:49:16
【问题描述】:
我正在尝试使用 MurmurHash3 哈希函数编写 Bloom 过滤器的 C++ 实现。我的实现基于这个站点:http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/
不知何故,在我的 BloomFilter 头文件中,哈希函数抛出了一个不完整的类型错误,而且,当我在 add 函数中使用哈希函数时,我得到一个“哈希是模棱两可的错误”。
我能做些什么来解决这个问题?我对 C++ 有点陌生,所以我不确定我是否正确使用了结构的接口/实现。
我还使用了一个包含此文件的主函数并运行一些测试来分析误报率、位数、过滤器大小等。 . .
#ifndef BLOOM_FILTER_H
#define BLOOM_FILTER_H
#include "MurmurHash3.h"
#include <vector>
//basic structure of a bloom filter object
struct BloomFilter {
BloomFilter(uint64_t size, uint8_t numHashes);
void add(const uint8_t *data, std::size_t len);
bool possiblyContains(const uint8_t *data, std::size_t len) const;
private:
uint8_t m_numHashes;
std::vector<bool> m_bits;
};
//Bloom filter constructor
BloomFilter::BloomFilter(uint64_t size, uint8_t numHashes)
: m_bits(size),
m_numHashes(numHashes) {}
//Hash array created using the MurmurHash3 code
std::array<uint64_t, 2> hash(const uint8_t *data, std::size_t len)
{
std::array<uint64_t, 2> hashValue;
MurmurHash3_x64_128(data, len, 0, hashValue.data());
return hashValue;
}
//Hash array created using the MurmurHash3 code
inline uint64_t nthHash(uint8_t n,
uint64_t hashA,
uint64_t hashB,
uint64_t filterSize) {
return (hashA + n * hashB) % filterSize;
}
//Adds an element to the array
void BloomFilter::add(const uint8_t *data, std::size_t len) {
auto hashValues = hash(data, len);
for (int n = 0; n < m_numHashes; n++)
{
m_bits[nthHash(n, hashValues[0], hashValues[1], m_bits.size())] = true;
}
}
//Returns true or false based on a probabilistic assesment of the array using MurmurHash3
bool BloomFilter::possiblyContains(const uint8_t *data, std::size_t len) const {
auto hashValues = hash(data, len);
for (int n = 0; n < m_numHashes; n++)
{
if (!m_bits[nthHash(n, hashValues[0], hashValues[1], m_bits.size())])
{
return false;
}
}
return true;
}
#endif
【问题讨论】:
-
请发布您所面临的确切的、未经编辑的错误消息。
-
MurmurHash3_x64_128(data, len, 0, hashValue.data());这在我看来很可疑。你从哪里得到定义?
标签: c++ hash bloom-filter