4.1155-freebsd-126-freebsd-12freebsd-9.3
Line | |
---|
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_ */ |
---|
Note: See
TracBrowser
for help on using the repository browser.