/
hash_impl.hh
49 lines (37 loc) · 1.09 KB
/
hash_impl.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#ifndef MPHF_HASH_IMPL_HH
#define MPHF_HASH_IMPL_HH
#include <cstdlib>
#include <cstring>
namespace MPHF {
class HashImpl {
public:
struct Param {
Param(unsigned ini, unsigned mul)
: ini(ini), mul(mul) {}
Param()
: ini(rand()), mul(rand()%224+32) {}
const unsigned ini;
const unsigned mul;
};
HashImpl(unsigned ini, unsigned mul) : param(ini,mul) {}
HashImpl() {}
static void set_seed(unsigned seed) { srand(seed); }
static const unsigned ui_size_minus8 = sizeof(unsigned)*8 - 8;
unsigned hash(const char* key, unsigned size) const {
const unsigned* u = (const unsigned*)(key);
unsigned h = param.ini;
unsigned i = sizeof(unsigned);
for(; i <= size; i += sizeof(unsigned), u++)
h = h*param.mul ^ *u + (h>>ui_size_minus8);
if((i-=sizeof(unsigned)) != size)
for(; i < size; i++)
h = h*param.mul ^ key[i] + (h>>ui_size_minus8);
return h;
}
unsigned hash(const char* key) const {
return hash(key, strlen(key));
}
const Param param;
};
}
#endif