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_ */ 72