50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #ifndef _MINIX_HASH_H
 | |
| #define _MINIX_HASH_H 1
 | |
| 
 | |
| #include <stdint.h>
 | |
| 
 | |
| /* This code is taken from:
 | |
|  * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
 | |
|  * (macro names modified)
 | |
|  */
 | |
| 
 | |
| #define hash_rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
 | |
| 
 | |
| #define hash_mix(a,b,c) \
 | |
| { \
 | |
|   a -= c;  a ^= hash_rot(c, 4);  c += b; \
 | |
|   b -= a;  b ^= hash_rot(a, 6);  a += c; \
 | |
|   c -= b;  c ^= hash_rot(b, 8);  b += a; \
 | |
|   a -= c;  a ^= hash_rot(c,16);  c += b; \
 | |
|   b -= a;  b ^= hash_rot(a,19);  a += c; \
 | |
|   c -= b;  c ^= hash_rot(b, 4);  b += a; \
 | |
| }
 | |
| 
 | |
| #define hash_final(a,b,c) \
 | |
| { \
 | |
|   c ^= b; c -= hash_rot(b,14); \
 | |
|   a ^= c; a -= hash_rot(c,11); \
 | |
|   b ^= a; b -= hash_rot(a,25); \
 | |
|   c ^= b; c -= hash_rot(b,16); \
 | |
|   a ^= c; a -= hash_rot(c,4);  \
 | |
|   b ^= a; b -= hash_rot(a,14); \
 | |
|   c ^= b; c -= hash_rot(b,24); \
 | |
| }
 | |
| 
 | |
| #define hash_i_64(a, u, v) {				\
 | |
| 	u32_t i1 = (a), i2 = ex64lo(u), i3 = ex64hi(u);	\
 | |
| 	hash_mix(i1, i2, i3);				\
 | |
| 	hash_final(i1, i2, i3);				\
 | |
| 	(v) = i3;					\
 | |
| }
 | |
| 
 | |
| #define hash_32(n, v) {					\
 | |
| 	u32_t i1 = 0xa5a5a5a5, i2 = 0x12345678, i3 = n;	\
 | |
| 	hash_mix(i1, i2, i3);				\
 | |
| 	hash_final(i1, i2, i3);				\
 | |
| 	(v) = i3;					\
 | |
| }
 | |
| 
 | |
| #endif
 | 
