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