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 13typedef u_int32_t Fnv32_t; 14typedef 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 22static __inline Fnv32_t 23fnv_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 34static __inline Fnv32_t 35fnv_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 47static __inline Fnv64_t 48fnv_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 59static __inline Fnv64_t 60fnv_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