xref: /freebsd/sys/sys/fnv_hash.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
160727d8bSWarner Losh /*-
26eb39ac8SPeter Wemm  * Fowler / Noll / Vo Hash (FNV Hash)
36eb39ac8SPeter Wemm  * http://www.isthe.com/chongo/tech/comp/fnv/
46eb39ac8SPeter Wemm  *
56eb39ac8SPeter Wemm  * This is an implementation of the algorithms posted above.
66eb39ac8SPeter Wemm  * This file is placed in the public domain by Peter Wemm.
76eb39ac8SPeter Wemm  */
8a90d1c4bSAndrey V. Elsukov #ifndef _SYS_FNV_HASH_H_
9a90d1c4bSAndrey V. Elsukov #define	_SYS_FNV_HASH_H_
106eb39ac8SPeter Wemm 
11439fea92SPeter Wemm typedef u_int32_t Fnv32_t;
12439fea92SPeter Wemm typedef u_int64_t Fnv64_t;
136eb39ac8SPeter Wemm 
14439fea92SPeter Wemm #define FNV1_32_INIT ((Fnv32_t) 33554467UL)
15439fea92SPeter Wemm #define FNV1_64_INIT ((Fnv64_t) 0xcbf29ce484222325ULL)
166eb39ac8SPeter Wemm 
17439fea92SPeter Wemm #define FNV_32_PRIME ((Fnv32_t) 0x01000193UL)
18439fea92SPeter Wemm #define FNV_64_PRIME ((Fnv64_t) 0x100000001b3ULL)
19439fea92SPeter Wemm 
20439fea92SPeter Wemm static __inline Fnv32_t
fnv_32_buf(const void * buf,size_t len,Fnv32_t hval)21439fea92SPeter Wemm fnv_32_buf(const void *buf, size_t len, Fnv32_t hval)
226eb39ac8SPeter Wemm {
236eb39ac8SPeter Wemm 	const u_int8_t *s = (const u_int8_t *)buf;
246eb39ac8SPeter Wemm 
256eb39ac8SPeter Wemm 	while (len-- != 0) {
266eb39ac8SPeter Wemm 		hval *= FNV_32_PRIME;
276eb39ac8SPeter Wemm 		hval ^= *s++;
286eb39ac8SPeter Wemm 	}
296eb39ac8SPeter Wemm 	return hval;
306eb39ac8SPeter Wemm }
316eb39ac8SPeter Wemm 
32439fea92SPeter Wemm static __inline Fnv32_t
fnv_32_str(const char * str,Fnv32_t hval)33439fea92SPeter Wemm fnv_32_str(const char *str, Fnv32_t hval)
346eb39ac8SPeter Wemm {
356eb39ac8SPeter Wemm 	const u_int8_t *s = (const u_int8_t *)str;
36439fea92SPeter Wemm 	Fnv32_t c;
376eb39ac8SPeter Wemm 
386eb39ac8SPeter Wemm 	while ((c = *s++) != 0) {
396eb39ac8SPeter Wemm 		hval *= FNV_32_PRIME;
406eb39ac8SPeter Wemm 		hval ^= c;
416eb39ac8SPeter Wemm 	}
426eb39ac8SPeter Wemm 	return hval;
436eb39ac8SPeter Wemm }
446eb39ac8SPeter Wemm 
45439fea92SPeter Wemm static __inline Fnv64_t
fnv_64_buf(const void * buf,size_t len,Fnv64_t hval)46439fea92SPeter Wemm fnv_64_buf(const void *buf, size_t len, Fnv64_t hval)
476eb39ac8SPeter Wemm {
486eb39ac8SPeter Wemm 	const u_int8_t *s = (const u_int8_t *)buf;
496eb39ac8SPeter Wemm 
506eb39ac8SPeter Wemm 	while (len-- != 0) {
516eb39ac8SPeter Wemm 		hval *= FNV_64_PRIME;
526eb39ac8SPeter Wemm 		hval ^= *s++;
536eb39ac8SPeter Wemm 	}
546eb39ac8SPeter Wemm 	return hval;
556eb39ac8SPeter Wemm }
566eb39ac8SPeter Wemm 
57439fea92SPeter Wemm static __inline Fnv64_t
fnv_64_str(const char * str,Fnv64_t hval)58439fea92SPeter Wemm fnv_64_str(const char *str, Fnv64_t hval)
596eb39ac8SPeter Wemm {
606eb39ac8SPeter Wemm 	const u_int8_t *s = (const u_int8_t *)str;
61*e7d939bdSMarcel Moolenaar 	u_register_t c;		 /* 32 bit on i386, 64 bit on alpha */
626eb39ac8SPeter Wemm 
636eb39ac8SPeter Wemm 	while ((c = *s++) != 0) {
646eb39ac8SPeter Wemm 		hval *= FNV_64_PRIME;
656eb39ac8SPeter Wemm 		hval ^= c;
666eb39ac8SPeter Wemm 	}
676eb39ac8SPeter Wemm 	return hval;
686eb39ac8SPeter Wemm }
69a90d1c4bSAndrey V. Elsukov #endif /* _SYS_FNV_HASH_H_ */
70