/home/uke/oil/mycpp/hash.cc
Line | Count | Source |
1 | | #include "mycpp/hash.h" |
2 | | |
3 | | #include "mycpp/gc_str.h" |
4 | | #include "mycpp/gc_tuple.h" |
5 | | |
6 | 423k | unsigned fnv1(const char* data, int len) { |
7 | | // FNV-1 from http://www.isthe.com/chongo/tech/comp/fnv/#FNV-1 |
8 | 423k | unsigned h = 2166136261; // 32-bit FNV-1 offset basis |
9 | 423k | constexpr int p = 16777619; // 32-bit FNV-1 prime |
10 | 3.51M | for (int i = 0; i < len; i++) { |
11 | 3.09M | h *= p; |
12 | | // log("1. h = %d", h); |
13 | 3.09M | h ^= data[i]; |
14 | | // log("2. h = %d", h); |
15 | 3.09M | } |
16 | 423k | return h; |
17 | 423k | } |
18 | | |
19 | 763 | unsigned hash_key(BigStr* s) { |
20 | 763 | return s->hash(fnv1); |
21 | 763 | } |
22 | | |
23 | 74.2k | unsigned hash_key(int n) { |
24 | 74.2k | return fnv1(reinterpret_cast<const char*>(&n), sizeof(n)); |
25 | 74.2k | } |
26 | | |
27 | 348k | unsigned hash_key(mops::BigInt n) { |
28 | | // Bug fix: our dict sizing is a power of 2, and we don't want integers in |
29 | | // the workload to interact badly with it. |
30 | 348k | return fnv1(reinterpret_cast<const char*>(&n), sizeof(n)); |
31 | 348k | } |
32 | | |
33 | 274 | unsigned hash_key(void* p) { |
34 | | // e.g. for Dict<Token*, int>, hash the pointer itself, which means we use |
35 | | // object IDENTITY, not value. |
36 | 274 | return fnv1(reinterpret_cast<const char*>(&p), sizeof(void*)); |
37 | 274 | } |
38 | | |
39 | 12 | unsigned hash_key(Tuple2<int, int>* t1) { |
40 | 12 | return t1->at0() + t1->at1(); |
41 | 12 | } |
42 | | |
43 | 12 | unsigned hash_key(Tuple2<BigStr*, int>* t1) { |
44 | 12 | return t1->at0()->hash(fnv1) + t1->at1(); |
45 | 12 | } |