40 using value_t = uint32_t;
41 static const constexpr value_t kNil = ~static_cast<value_t>(0);
46 DEFINE_STRONG_INT_TYPE(stored_key_t, uint32_t);
48 static stored_key_t narrow(uint64_t k) {
return stored_key_t(k + (k >> 32)); }
54 kv() : k(stored_key_t(0)), v(kNil) {}
57 PdqHash() : bits_(10), sz_(0), table_(capacity()) {}
59 void insert(uint64_t k64, value_t v) {
60 if (2 * sz_ > capacity()) {
63 insert0(narrow(k64), v);
66 size_t find(uint64_t k64,
const std::function<
bool(value_t)> &pred) {
67 stored_key_t k = narrow(k64);
68 size_t mask = (size_t(1) << bits_) - 1;
70 for (
size_t h = hash(k);; h += dh) {
71 const kv *p = &table_[h & mask];
76 if (p->k == k && pred(p->v)) {
84 void insert0(stored_key_t k, value_t v) {
85 size_t mask = (size_t(1) << bits_) - 1;
87 for (
size_t h = hash(k);; h += dh) {
88 kv *p = &table_[h & mask];
99 uint64_t hash(uint64_t k) {
100 return k + 3 * (k >> bits_) + 7 * (k >> (2 * bits_));
102 uint64_t hash(stored_key_t nk) {
return hash(
static_cast<uint64_t
>(nk)); }
103 uint64_t dhash(stored_key_t nk) {
106 return 2 * hash(hash(nk)) + 1;
110 std::vector<kv> table1(capacity());
112 for (
const auto &p : table1) {
119 size_t capacity() {
return size_t(1) << bits_; }
123 std::vector<kv> table_;