xref: /aosp_15_r20/external/AFLplusplus/include/hash.h (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker    american fuzzy lop++ - hashing function
3*08b48e0bSAndroid Build Coastguard Worker    ---------------------------------------
4*08b48e0bSAndroid Build Coastguard Worker 
5*08b48e0bSAndroid Build Coastguard Worker    The hash32() function is a variant of MurmurHash3, a good
6*08b48e0bSAndroid Build Coastguard Worker    non-cryptosafe hashing function developed by Austin Appleby.
7*08b48e0bSAndroid Build Coastguard Worker 
8*08b48e0bSAndroid Build Coastguard Worker    For simplicity, this variant does *NOT* accept buffer lengths
9*08b48e0bSAndroid Build Coastguard Worker    that are not divisible by 8 bytes. The 32-bit version is otherwise
10*08b48e0bSAndroid Build Coastguard Worker    similar to the original; the 64-bit one is a custom hack with
11*08b48e0bSAndroid Build Coastguard Worker    mostly-unproven properties.
12*08b48e0bSAndroid Build Coastguard Worker 
13*08b48e0bSAndroid Build Coastguard Worker    Austin's original code is public domain.
14*08b48e0bSAndroid Build Coastguard Worker 
15*08b48e0bSAndroid Build Coastguard Worker    Other code written by Michal Zalewski
16*08b48e0bSAndroid Build Coastguard Worker 
17*08b48e0bSAndroid Build Coastguard Worker    Copyright 2016 Google Inc. All rights reserved.
18*08b48e0bSAndroid Build Coastguard Worker    Copyright 2019-2024 AFLplusplus Project. All rights reserved.
19*08b48e0bSAndroid Build Coastguard Worker 
20*08b48e0bSAndroid Build Coastguard Worker    Licensed under the Apache License, Version 2.0 (the "License");
21*08b48e0bSAndroid Build Coastguard Worker    you may not use this file except in compliance with the License.
22*08b48e0bSAndroid Build Coastguard Worker    You may obtain a copy of the License at:
23*08b48e0bSAndroid Build Coastguard Worker 
24*08b48e0bSAndroid Build Coastguard Worker      https://www.apache.org/licenses/LICENSE-2.0
25*08b48e0bSAndroid Build Coastguard Worker 
26*08b48e0bSAndroid Build Coastguard Worker  */
27*08b48e0bSAndroid Build Coastguard Worker 
28*08b48e0bSAndroid Build Coastguard Worker #ifndef _HAVE_HASH_H
29*08b48e0bSAndroid Build Coastguard Worker #define _HAVE_HASH_H
30*08b48e0bSAndroid Build Coastguard Worker 
31*08b48e0bSAndroid Build Coastguard Worker #include "types.h"
32*08b48e0bSAndroid Build Coastguard Worker 
33*08b48e0bSAndroid Build Coastguard Worker u32 hash32(u8 *key, u32 len, u32 seed);
34*08b48e0bSAndroid Build Coastguard Worker u64 hash64(u8 *key, u32 len, u64 seed);
35*08b48e0bSAndroid Build Coastguard Worker 
36*08b48e0bSAndroid Build Coastguard Worker #if 0
37*08b48e0bSAndroid Build Coastguard Worker 
38*08b48e0bSAndroid Build Coastguard Worker The following code is disabled because xxh3 is 30% faster
39*08b48e0bSAndroid Build Coastguard Worker 
40*08b48e0bSAndroid Build Coastguard Worker   #ifdef __x86_64__
41*08b48e0bSAndroid Build Coastguard Worker 
42*08b48e0bSAndroid Build Coastguard Worker     #define ROL64(_x, _r) ((((u64)(_x)) << (_r)) | (((u64)(_x)) >> (64 - (_r))))
43*08b48e0bSAndroid Build Coastguard Worker 
44*08b48e0bSAndroid Build Coastguard Worker static inline u32 hash32(u8 *key, u32 len, u32 seed) {
45*08b48e0bSAndroid Build Coastguard Worker 
46*08b48e0bSAndroid Build Coastguard Worker   const u64 *data = (u64 *)key;
47*08b48e0bSAndroid Build Coastguard Worker   u64        h1 = seed ^ len;
48*08b48e0bSAndroid Build Coastguard Worker 
49*08b48e0bSAndroid Build Coastguard Worker   len >>= 3;
50*08b48e0bSAndroid Build Coastguard Worker 
51*08b48e0bSAndroid Build Coastguard Worker   while (len--) {
52*08b48e0bSAndroid Build Coastguard Worker 
53*08b48e0bSAndroid Build Coastguard Worker     u64 k1 = *data++;
54*08b48e0bSAndroid Build Coastguard Worker 
55*08b48e0bSAndroid Build Coastguard Worker     k1 *= 0x87c37b91114253d5ULL;
56*08b48e0bSAndroid Build Coastguard Worker     k1 = ROL64(k1, 31);
57*08b48e0bSAndroid Build Coastguard Worker     k1 *= 0x4cf5ad432745937fULL;
58*08b48e0bSAndroid Build Coastguard Worker 
59*08b48e0bSAndroid Build Coastguard Worker     h1 ^= k1;
60*08b48e0bSAndroid Build Coastguard Worker     h1 = ROL64(h1, 27);
61*08b48e0bSAndroid Build Coastguard Worker     h1 = h1 * 5 + 0x52dce729;
62*08b48e0bSAndroid Build Coastguard Worker 
63*08b48e0bSAndroid Build Coastguard Worker   }
64*08b48e0bSAndroid Build Coastguard Worker 
65*08b48e0bSAndroid Build Coastguard Worker   h1 ^= h1 >> 33;
66*08b48e0bSAndroid Build Coastguard Worker   h1 *= 0xff51afd7ed558ccdULL;
67*08b48e0bSAndroid Build Coastguard Worker   h1 ^= h1 >> 33;
68*08b48e0bSAndroid Build Coastguard Worker   h1 *= 0xc4ceb9fe1a85ec53ULL;
69*08b48e0bSAndroid Build Coastguard Worker   h1 ^= h1 >> 33;
70*08b48e0bSAndroid Build Coastguard Worker 
71*08b48e0bSAndroid Build Coastguard Worker   return h1;
72*08b48e0bSAndroid Build Coastguard Worker 
73*08b48e0bSAndroid Build Coastguard Worker }
74*08b48e0bSAndroid Build Coastguard Worker 
75*08b48e0bSAndroid Build Coastguard Worker   #else
76*08b48e0bSAndroid Build Coastguard Worker 
77*08b48e0bSAndroid Build Coastguard Worker     #define ROL32(_x, _r) ((((u32)(_x)) << (_r)) | (((u32)(_x)) >> (32 - (_r))))
78*08b48e0bSAndroid Build Coastguard Worker 
79*08b48e0bSAndroid Build Coastguard Worker static inline u32 hash32(const void *key, u32 len, u32 seed) {
80*08b48e0bSAndroid Build Coastguard Worker 
81*08b48e0bSAndroid Build Coastguard Worker   const u32 *data = (u32 *)key;
82*08b48e0bSAndroid Build Coastguard Worker   u32        h1 = seed ^ len;
83*08b48e0bSAndroid Build Coastguard Worker 
84*08b48e0bSAndroid Build Coastguard Worker   len >>= 2;
85*08b48e0bSAndroid Build Coastguard Worker 
86*08b48e0bSAndroid Build Coastguard Worker   while (len--) {
87*08b48e0bSAndroid Build Coastguard Worker 
88*08b48e0bSAndroid Build Coastguard Worker     u32 k1 = *data++;
89*08b48e0bSAndroid Build Coastguard Worker 
90*08b48e0bSAndroid Build Coastguard Worker     k1 *= 0xcc9e2d51;
91*08b48e0bSAndroid Build Coastguard Worker     k1 = ROL32(k1, 15);
92*08b48e0bSAndroid Build Coastguard Worker     k1 *= 0x1b873593;
93*08b48e0bSAndroid Build Coastguard Worker 
94*08b48e0bSAndroid Build Coastguard Worker     h1 ^= k1;
95*08b48e0bSAndroid Build Coastguard Worker     h1 = ROL32(h1, 13);
96*08b48e0bSAndroid Build Coastguard Worker     h1 = h1 * 5 + 0xe6546b64;
97*08b48e0bSAndroid Build Coastguard Worker 
98*08b48e0bSAndroid Build Coastguard Worker   }
99*08b48e0bSAndroid Build Coastguard Worker 
100*08b48e0bSAndroid Build Coastguard Worker   h1 ^= h1 >> 16;
101*08b48e0bSAndroid Build Coastguard Worker   h1 *= 0x85ebca6b;
102*08b48e0bSAndroid Build Coastguard Worker   h1 ^= h1 >> 13;
103*08b48e0bSAndroid Build Coastguard Worker   h1 *= 0xc2b2ae35;
104*08b48e0bSAndroid Build Coastguard Worker   h1 ^= h1 >> 16;
105*08b48e0bSAndroid Build Coastguard Worker 
106*08b48e0bSAndroid Build Coastguard Worker   return h1;
107*08b48e0bSAndroid Build Coastguard Worker 
108*08b48e0bSAndroid Build Coastguard Worker }
109*08b48e0bSAndroid Build Coastguard Worker 
110*08b48e0bSAndroid Build Coastguard Worker   #endif                                                     /* ^__x86_64__ */
111*08b48e0bSAndroid Build Coastguard Worker #endif
112*08b48e0bSAndroid Build Coastguard Worker 
113*08b48e0bSAndroid Build Coastguard Worker #endif                                                     /* !_HAVE_HASH_H */
114*08b48e0bSAndroid Build Coastguard Worker 
115