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