-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfnv64a_hash.h
101 lines (93 loc) · 3.46 KB
/
fnv64a_hash.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// /*
// * fnv - Fowler/Noll/Vo- hash code
// *
// * @(#) $Revision: 5.4 $
// * @(#) $Id: fnv.h,v 5.4 2009/07/30 22:49:13 chongo Exp $
// * @(#) $Source: /usr/local/src/cmd/fnv/RCS/fnv.h,v $
// *
// ***
// *
// * Fowler/Noll/Vo- hash
// *
// * The basis of this hash algorithm was taken from an idea sent
// * as reviewer comments to the IEEE POSIX P1003.2 committee by:
// *
// * Phong Vo (http://www.research.att.com/info/kpv/)
// * Glenn Fowler (http://www.research.att.com/~gsf/)
// *
// * In a subsequent ballot round:
// *
// * Landon Curt Noll (http://www.isthe.com/chongo/)
// *
// * improved on their algorithm. Some people tried this hash
// * and found that it worked rather well. In an EMail message
// * to Landon, they named it the ``Fowler/Noll/Vo'' or FNV hash.
// *
// * FNV hashes are designed to be fast while maintaining a low
// * collision rate. The FNV speed allows one to quickly hash lots
// * of data while maintaining a reasonable collision rate. See:
// *
// * http://www.isthe.com/chongo/tech/comp/fnv/index.html
// *
// * for more details as well as other forms of the FNV hash.
// *
// ***
// *
// * NOTE: The FNV-0 historic hash is not recommended. One should use
// * the FNV-1 hash instead.
// *
// * To use the 32 bit FNV-0 historic hash, pass FNV0_32_INIT as the
// * Fnv32_t hashval argument to fnv_32_buf() or fnv_32_str().
// *
// * To use the 64 bit FNV-0 historic hash, pass FNV0_64_INIT as the
// * Fnv64_t hashval argument to fnv_64_buf() or fnv_64_str().
// *
// * To use the recommended 32 bit FNV-1 hash, pass FNV1_32_INIT as the
// * Fnv32_t hashval argument to fnv_32_buf() or fnv_32_str().
// *
// * To use the recommended 64 bit FNV-1 hash, pass FNV1_64_INIT as the
// * Fnv64_t hashval argument to fnv_64_buf() or fnv_64_str().
// *
// * To use the recommended 32 bit FNV-1a hash, pass FNV1_32A_INIT as the
// * Fnv32_t hashval argument to fnv_32a_buf() or fnv_32a_str().
// *
// * To use the recommended 64 bit FNV-1a hash, pass FNV1A_64_INIT as the
// * Fnv64_t hashval argument to fnv_64a_buf() or fnv_64a_str().
// *
// ***
// *
// * Please do not copyright this code. This code is in the public domain.
// *
// * LANDON CURT NOLL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
// * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
// * EVENT SHALL LANDON CURT NOLL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
// * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
// * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
// * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// * PERFORMANCE OF THIS SOFTWARE.
// *
// * By:
// * chongo <Landon Curt Noll> /\oo/\
// * http://www.isthe.com/chongo/
// *
// * Share and Enjoy! :-)
// */
#ifndef _FNV64A_HASH_H
#define _FNV64A_HASH_H
static constexpr uint64_t FNV1A_64_INIT = UINT64_C(0xcbf29ce484222325);
static constexpr uint64_t FNV_64_PRIME = UINT64_C(0x100000001b3);
uint64_t fnv64a_hash(const std::string& str, uint64_t multiplier, uint64_t adjustment) {
uint64_t hval = FNV1A_64_INIT;
//
// FNV-1a hash each octet of the buffer
//
for (int i = 0; i < str.size(); i++) {
// xor the bottom with the current octet
hval ^= static_cast<uint64_t>(str[i]);
// multiply by the 64 bit FNV magic prime mod 2^64
hval *= FNV_64_PRIME;
}
// return our new hash value
return hval + adjustment;
}
#endif // _FNV64A_HASH_H