aboutsummaryrefslogtreecommitdiff
path: root/core/hash/mini.odin
blob: 024e88abc4a610b3e94a16d6e49e2687d12d7204 (plain)
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
package hash

ginger_hash8 :: proc(x: u8) -> u8 {
	h := x * 251;
	h += ~(x << 3);
	h ~=  (x >> 1);
	h += ~(x << 7);
	h ~=  (x >> 6);
	h +=  (x << 2);
	return h;
}


ginger_hash16 :: proc(x: u16) -> u16 {
	z := (x << 8) | (x >> 8);
	h := z;
	h += ~(z << 5);
	h ~=  (z >> 2);
	h += ~(z << 13);
	h ~=  (z >> 10);
	h += ~(z << 4);
	h = (h << 10) | (h >> 10);
	return h;
}


ginger8 :: proc(data: []byte) -> u8 {
	h := ginger_hash8(0);
	for b in data {
		h ~= ginger_hash8(b);
	}
	return h;
}
ginger16 :: proc(data: []byte) -> u16 {
	h := ginger_hash16(0);
	for b in data {
		h ~= ginger_hash16(u16(b));
	}
	return h;
}