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