]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/sys/fnv_hash.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / sys / fnv_hash.h
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,ia64 */
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_ */