OILS / mycpp / hash.cc View on Github | oilshell.org

39 lines, 20 significant
1#include "mycpp/hash.h"
2
3#include "mycpp/gc_str.h"
4#include "mycpp/gc_tuple.h"
5
6unsigned fnv1(const char* data, int len) {
7 // FNV-1 from http://www.isthe.com/chongo/tech/comp/fnv/#FNV-1
8 unsigned h = 2166136261; // 32-bit FNV-1 offset basis
9 constexpr int p = 16777619; // 32-bit FNV-1 prime
10 for (int i = 0; i < len; i++) {
11 h *= p;
12 // log("1. h = %d", h);
13 h ^= data[i];
14 // log("2. h = %d", h);
15 }
16 return h;
17}
18
19unsigned hash_key(BigStr* s) {
20 return s->hash(fnv1);
21}
22
23unsigned hash_key(int n) {
24 return n;
25}
26
27unsigned hash_key(Tuple2<int, int>* t1) {
28 return t1->at0() + t1->at1();
29}
30
31unsigned hash_key(Tuple2<BigStr*, int>* t1) {
32 return t1->at0()->hash(fnv1) + t1->at1();
33}
34
35// e.g. for Dict<Token*, int>, hash the pointer itself, which means we use
36// object IDENTITY, not value.
37unsigned hash_key(void* p) {
38 return fnv1(reinterpret_cast<const char*>(&p), sizeof(void*));
39}