mycpp

Coverage Report

Created: 2024-06-09 06:28

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