1139825Simp/*- 274384Speter * Fowler / Noll / Vo Hash (FNV Hash) 374384Speter * http://www.isthe.com/chongo/tech/comp/fnv/ 474384Speter * 574384Speter * This is an implementation of the algorithms posted above. 674384Speter * This file is placed in the public domain by Peter Wemm. 774384Speter * 874384Speter * $FreeBSD$ 974384Speter */ 10244209Sae#ifndef _SYS_FNV_HASH_H_ 11244209Sae#define _SYS_FNV_HASH_H_ 1274384Speter 1374501Spetertypedef u_int32_t Fnv32_t; 1474501Spetertypedef u_int64_t Fnv64_t; 1574384Speter 1674501Speter#define FNV1_32_INIT ((Fnv32_t) 33554467UL) 1774501Speter#define FNV1_64_INIT ((Fnv64_t) 0xcbf29ce484222325ULL) 1874384Speter 1974501Speter#define FNV_32_PRIME ((Fnv32_t) 0x01000193UL) 2074501Speter#define FNV_64_PRIME ((Fnv64_t) 0x100000001b3ULL) 2174501Speter 2274501Speterstatic __inline Fnv32_t 2374501Speterfnv_32_buf(const void *buf, size_t len, Fnv32_t hval) 2474384Speter{ 2574384Speter const u_int8_t *s = (const u_int8_t *)buf; 2674384Speter 2774384Speter while (len-- != 0) { 2874384Speter hval *= FNV_32_PRIME; 2974384Speter hval ^= *s++; 3074384Speter } 3174384Speter return hval; 3274384Speter} 3374384Speter 3474501Speterstatic __inline Fnv32_t 3574501Speterfnv_32_str(const char *str, Fnv32_t hval) 3674384Speter{ 3774384Speter const u_int8_t *s = (const u_int8_t *)str; 3874501Speter Fnv32_t c; 3974384Speter 4074384Speter while ((c = *s++) != 0) { 4174384Speter hval *= FNV_32_PRIME; 4274384Speter hval ^= c; 4374384Speter } 4474384Speter return hval; 4574384Speter} 4674384Speter 4774501Speterstatic __inline Fnv64_t 4874501Speterfnv_64_buf(const void *buf, size_t len, Fnv64_t hval) 4974384Speter{ 5074384Speter const u_int8_t *s = (const u_int8_t *)buf; 5174384Speter 5274384Speter while (len-- != 0) { 5374384Speter hval *= FNV_64_PRIME; 5474384Speter hval ^= *s++; 5574384Speter } 5674384Speter return hval; 5774384Speter} 5874384Speter 5974501Speterstatic __inline Fnv64_t 6074501Speterfnv_64_str(const char *str, Fnv64_t hval) 6174384Speter{ 6274384Speter const u_int8_t *s = (const u_int8_t *)str; 6374384Speter u_register_t c; /* 32 bit on i386, 64 bit on alpha,ia64 */ 6474384Speter 6574384Speter while ((c = *s++) != 0) { 6674384Speter hval *= FNV_64_PRIME; 6774384Speter hval ^= c; 6874384Speter } 6974384Speter return hval; 7074384Speter} 71244209Sae#endif /* _SYS_FNV_HASH_H_ */ 72