libboxes
boxes is a set of specialised containers built on top of STL
hashes.cpp
1#include <boxes/hashes.hpp>
2
3namespace boxes::hash {
4
5XXHash64::XXHash64(uint64_t seed)
6 : seed{seed}, state{nullptr, XXH64_freeState} {
7 state.reset(XXH64_createState());
8}
9
10void XXHash64::reset() { XXH64_reset(state.get(), seed); }
11
12void XXHash64::operator()(const uint8_t *key, std::size_t len) {
13 if (XXH_ERROR == XXH64_update(state.get(), key, len)) {
14 throw std::runtime_error("XXH64_update failed");
15 }
16}
17
18uint64_t XXHash64::final() const { return XXH64_digest(state.get()); }
19
20#define BIG_CONSTANT(x) (x##LLU)
21
22Murmur2A_X64_64::Murmur2A_X64_64(uint64_t seed) : seed{seed} {}
23
24void Murmur2A_X64_64::reset() { h = seed; }
25
26void Murmur2A_X64_64::operator()(const uint8_t *key, std::size_t len) {
27 const uint64_t m = BIG_CONSTANT(0xc6a4a7935bd1e995);
28 const int r = 47;
29
30 h ^= (len * m);
31
32 const uint64_t *data = (const uint64_t *)key;
33 const uint64_t *end = data + (len / 8);
34
35 while (data != end) {
36 uint64_t k = *data++;
37
38 k *= m;
39 k ^= k >> r;
40 k *= m;
41
42 h ^= k;
43 h *= m;
44 }
45
46 const unsigned char *data2 = (const unsigned char *)data;
47
48 switch (len & 7) {
49 case 7:
50 h ^= uint64_t(data2[6]) << 48;
51 [[fallthrough]];
52 case 6:
53 h ^= uint64_t(data2[5]) << 40;
54 [[fallthrough]];
55 case 5:
56 h ^= uint64_t(data2[4]) << 32;
57 [[fallthrough]];
58 case 4:
59 h ^= uint64_t(data2[3]) << 24;
60 [[fallthrough]];
61 case 3:
62 h ^= uint64_t(data2[2]) << 16;
63 [[fallthrough]];
64 case 2:
65 h ^= uint64_t(data2[1]) << 8;
66 [[fallthrough]];
67 case 1:
68 h ^= uint64_t(data2[0]);
69 h *= m;
70 };
71
72 h ^= h >> r;
73 h *= m;
74 h ^= h >> r;
75}
76
77uint64_t Murmur2A_X64_64::final() const { return h; }
78
79BJOneAtATime::BJOneAtATime(uint64_t seed)
80 : seed{static_cast<uint32_t>(seed & 0xffffffff)} {}
81
82void BJOneAtATime::reset() { hash = seed; }
83
84void BJOneAtATime::operator()(const uint8_t *key, std::size_t length) {
85 size_t i = 0;
86 while (i != length) {
87 hash += key[i++];
88 hash += hash << 10;
89 hash ^= hash >> 6;
90 }
91 hash += hash << 3;
92 hash ^= hash >> 11;
93 hash += hash << 15;
94}
95
96uint64_t BJOneAtATime::final() const { return hash; }
97
98} // namespace boxes::hash
Contains wrappers for various hash functions that can be used in Bloom filters.