xref: /minix/minix/include/minix/hash.h (revision 7f5f010b)
1 
2 #ifndef _MINIX_HASH_H
3 #define _MINIX_HASH_H 1
4 
5 #include <stdint.h>
6 
7 /* This code is taken from:
8  * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
9  * (macro names modified)
10  */
11 
12 #define hash_rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
13 
14 #define hash_mix(a,b,c) \
15 { \
16   a -= c;  a ^= hash_rot(c, 4);  c += b; \
17   b -= a;  b ^= hash_rot(a, 6);  a += c; \
18   c -= b;  c ^= hash_rot(b, 8);  b += a; \
19   a -= c;  a ^= hash_rot(c,16);  c += b; \
20   b -= a;  b ^= hash_rot(a,19);  a += c; \
21   c -= b;  c ^= hash_rot(b, 4);  b += a; \
22 }
23 
24 #define hash_final(a,b,c) \
25 { \
26   c ^= b; c -= hash_rot(b,14); \
27   a ^= c; a -= hash_rot(c,11); \
28   b ^= a; b -= hash_rot(a,25); \
29   c ^= b; c -= hash_rot(b,16); \
30   a ^= c; a -= hash_rot(c,4);  \
31   b ^= a; b -= hash_rot(a,14); \
32   c ^= b; c -= hash_rot(b,24); \
33 }
34 
35 #define hash_i_64(a, u, v) {				\
36 	u32_t i1 = (a), i2 = ex64lo(u), i3 = ex64hi(u);	\
37 	hash_mix(i1, i2, i3);				\
38 	hash_final(i1, i2, i3);				\
39 	(v) = i3;					\
40 }
41 
42 #define hash_32(n, v) {					\
43 	u32_t i1 = 0xa5a5a5a5, i2 = 0x12345678, i3 = n;	\
44 	hash_mix(i1, i2, i3);				\
45 	hash_final(i1, i2, i3);				\
46 	(v) = i3;					\
47 }
48 
49 #endif
50