1/*
2 * Copyright 2008-2018 Aerospike, Inc.
3 *
4 * Portions may be licensed to Aerospike, Inc. under one or more contributor
5 * license agreements.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
8 * use this file except in compliance with the License. You may obtain a copy of
9 * the License at http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations under
15 * the License.
16 */
17
18#pragma once
19
20//==========================================================
21// Includes.
22//
23
24#include <stddef.h>
25
26//==========================================================
27// Public API.
28//
29
30// 32-bit Fowler-Noll-Vo hash function (FNV-1a).
31static inline uint32_t
32cf_hash_fnv32(const uint8_t* buf, size_t size)
33{
34 uint32_t hash = 2166136261;
35 const uint8_t* end = buf + size;
36
37 while (buf < end) {
38 hash ^= (uint32_t)*buf++;
39 hash *= 16777619;
40 }
41
42 return hash;
43}
44
45
46// 64-bit Fowler-Noll-Vo hash function (FNV-1a).
47static inline uint64_t
48cf_hash_fnv64(const uint8_t* buf, size_t size)
49{
50 uint64_t hash = 0xcbf29ce484222325ULL;
51 const uint8_t* end = buf + size;
52
53 while (buf < end) {
54 hash ^= (uint64_t)*buf++;
55 hash *= 0x100000001b3ULL;
56 }
57
58 return hash;
59}
60
61
62// 32-bit Jenkins One-at-a-Time hash function.
63static inline uint32_t
64cf_hash_jen32(const uint8_t* buf, size_t size)
65{
66 uint32_t hash = 0;
67 const uint8_t* end = buf + size;
68
69 while (buf < end) {
70 hash += (uint32_t)*buf++;
71 hash += hash << 10;
72 hash ^= hash >> 6;
73 }
74
75 hash += hash << 3;
76 hash ^= hash >> 11;
77 hash += hash << 15;
78
79 return hash;
80}
81
82
83// 64-bit Jenkins One-at-a-Time hash function.
84static inline uint64_t
85cf_hash_jen64(const uint8_t* buf, size_t size)
86{
87 uint64_t hash = 0;
88 const uint8_t* end = buf + size;
89
90 while (buf < end) {
91 hash += (uint64_t)*buf++;
92 hash += hash << 10;
93 hash ^= hash >> 6;
94 }
95
96 hash += hash << 3;
97 hash ^= hash >> 11;
98 hash += hash << 15;
99
100 return hash;
101}
102
103
104// 32-bit pointer hash.
105static inline uint32_t
106cf_hash_ptr32(const void* p_ptr)
107{
108 return (uint32_t)((*(const uint64_t*)p_ptr * 0xe221f97c30e94e1dULL) >> 32);
109}
110