committed by
GitHub
5 changed files with 124 additions and 30 deletions
@ -0,0 +1,64 @@ |
|||
// See LICENSE for license details.
|
|||
|
|||
#ifndef _RISCV_BLOOM_FILTER_H |
|||
#define _RISCV_BLOOM_FILTER_H |
|||
|
|||
#include <bitset> |
|||
#include <cstdint> |
|||
|
|||
struct simple_hash1 { |
|||
uint64_t operator()(uint64_t x) const |
|||
{ |
|||
x = (x ^ (x >> 33)) * 0xff51afd7ed558ccd; |
|||
x = (x ^ (x >> 33)) * 0xc4ceb9fe1a85ec53; |
|||
return x ^ (x >> 33); |
|||
} |
|||
}; |
|||
|
|||
struct simple_hash2 { |
|||
uint64_t operator()(uint64_t x) const |
|||
{ |
|||
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; |
|||
x = (x ^ (x >> 27)) * 0x94d049b13c66a8ed; |
|||
return x ^ (x >> 31); |
|||
} |
|||
}; |
|||
|
|||
template <typename T, typename H1, typename H2, size_t M, size_t K> // M: bit array size, K: number of hash functions
|
|||
class bloom_filter_t { |
|||
public: |
|||
void clear() |
|||
{ |
|||
bits.reset(); |
|||
} |
|||
|
|||
void insert(T value) |
|||
{ |
|||
uint64_t h1 = H1()(value); |
|||
uint64_t h2 = H2()(value); |
|||
|
|||
for (size_t i = 0; i < K; i++) { |
|||
size_t idx = (h1 + i * h2) % M; |
|||
bits[idx] = true; |
|||
} |
|||
} |
|||
|
|||
bool contains(T value) const |
|||
{ |
|||
uint64_t h1 = H1()(value); |
|||
uint64_t h2 = H2()(value); |
|||
|
|||
for (size_t i = 0; i < K; i++) { |
|||
size_t idx = (h1 + i * h2) % M; |
|||
if (!bits[idx]) |
|||
return false; |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
|
|||
private: |
|||
std::bitset<M> bits; |
|||
}; |
|||
|
|||
#endif |
|||
Loading…
Reference in new issue