xref: /freebsd/sys/sys/fnv_hash.h (revision 911f0260390e18cf85f3dbf2c719b593efdc1e3c)
1 /*-
2  * Fowler / Noll / Vo Hash (FNV Hash)
3  * http://www.isthe.com/chongo/tech/comp/fnv/
4  *
5  * This is an implementation of the algorithms posted above.
6  * This file is placed in the public domain by Peter Wemm.
7  *
8  * $FreeBSD$
9  */
10 #ifndef _SYS_FNV_HASH_H_
11 #define	_SYS_FNV_HASH_H_
12 
13 typedef u_int32_t Fnv32_t;
14 typedef u_int64_t Fnv64_t;
15 
16 #define FNV1_32_INIT ((Fnv32_t) 33554467UL)
17 #define FNV1_64_INIT ((Fnv64_t) 0xcbf29ce484222325ULL)
18 
19 #define FNV_32_PRIME ((Fnv32_t) 0x01000193UL)
20 #define FNV_64_PRIME ((Fnv64_t) 0x100000001b3ULL)
21 
22 static __inline Fnv32_t
23 fnv_32_buf(const void *buf, size_t len, Fnv32_t hval)
24 {
25 	const u_int8_t *s = (const u_int8_t *)buf;
26 
27 	while (len-- != 0) {
28 		hval *= FNV_32_PRIME;
29 		hval ^= *s++;
30 	}
31 	return hval;
32 }
33 
34 static __inline Fnv32_t
35 fnv_32_str(const char *str, Fnv32_t hval)
36 {
37 	const u_int8_t *s = (const u_int8_t *)str;
38 	Fnv32_t c;
39 
40 	while ((c = *s++) != 0) {
41 		hval *= FNV_32_PRIME;
42 		hval ^= c;
43 	}
44 	return hval;
45 }
46 
47 static __inline Fnv64_t
48 fnv_64_buf(const void *buf, size_t len, Fnv64_t hval)
49 {
50 	const u_int8_t *s = (const u_int8_t *)buf;
51 
52 	while (len-- != 0) {
53 		hval *= FNV_64_PRIME;
54 		hval ^= *s++;
55 	}
56 	return hval;
57 }
58 
59 static __inline Fnv64_t
60 fnv_64_str(const char *str, Fnv64_t hval)
61 {
62 	const u_int8_t *s = (const u_int8_t *)str;
63 	u_register_t c;		 /* 32 bit on i386, 64 bit on alpha */
64 
65 	while ((c = *s++) != 0) {
66 		hval *= FNV_64_PRIME;
67 		hval ^= c;
68 	}
69 	return hval;
70 }
71 #endif /* _SYS_FNV_HASH_H_ */
72