| /* |
| american fuzzy lop++ - hashing function |
| --------------------------------------- |
| |
| The hash32() function is a variant of MurmurHash3, a good |
| non-cryptosafe hashing function developed by Austin Appleby. |
| |
| For simplicity, this variant does *NOT* accept buffer lengths |
| that are not divisible by 8 bytes. The 32-bit version is otherwise |
| similar to the original; the 64-bit one is a custom hack with |
| mostly-unproven properties. |
| |
| Austin's original code is public domain. |
| |
| Other code written by Michal Zalewski |
| |
| Copyright 2016 Google Inc. All rights reserved. |
| Copyright 2019-2024 AFLplusplus Project. All rights reserved. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at: |
| |
| https://www.apache.org/licenses/LICENSE-2.0 |
| |
| */ |
| |
| #ifndef _HAVE_HASH_H |
| #define _HAVE_HASH_H |
| |
| #include "types.h" |
| |
| u32 hash32(u8 *key, u32 len, u32 seed); |
| u64 hash64(u8 *key, u32 len, u64 seed); |
| |
| #if 0 |
| |
| The following code is disabled because xxh3 is 30% faster |
| |
| #ifdef __x86_64__ |
| |
| #define ROL64(_x, _r) ((((u64)(_x)) << (_r)) | (((u64)(_x)) >> (64 - (_r)))) |
| |
| static inline u32 hash32(u8 *key, u32 len, u32 seed) { |
| |
| const u64 *data = (u64 *)key; |
| u64 h1 = seed ^ len; |
| |
| len >>= 3; |
| |
| while (len--) { |
| |
| u64 k1 = *data++; |
| |
| k1 *= 0x87c37b91114253d5ULL; |
| k1 = ROL64(k1, 31); |
| k1 *= 0x4cf5ad432745937fULL; |
| |
| h1 ^= k1; |
| h1 = ROL64(h1, 27); |
| h1 = h1 * 5 + 0x52dce729; |
| |
| } |
| |
| h1 ^= h1 >> 33; |
| h1 *= 0xff51afd7ed558ccdULL; |
| h1 ^= h1 >> 33; |
| h1 *= 0xc4ceb9fe1a85ec53ULL; |
| h1 ^= h1 >> 33; |
| |
| return h1; |
| |
| } |
| |
| #else |
| |
| #define ROL32(_x, _r) ((((u32)(_x)) << (_r)) | (((u32)(_x)) >> (32 - (_r)))) |
| |
| static inline u32 hash32(const void *key, u32 len, u32 seed) { |
| |
| const u32 *data = (u32 *)key; |
| u32 h1 = seed ^ len; |
| |
| len >>= 2; |
| |
| while (len--) { |
| |
| u32 k1 = *data++; |
| |
| k1 *= 0xcc9e2d51; |
| k1 = ROL32(k1, 15); |
| k1 *= 0x1b873593; |
| |
| h1 ^= k1; |
| h1 = ROL32(h1, 13); |
| h1 = h1 * 5 + 0xe6546b64; |
| |
| } |
| |
| h1 ^= h1 >> 16; |
| h1 *= 0x85ebca6b; |
| h1 ^= h1 >> 13; |
| h1 *= 0xc2b2ae35; |
| h1 ^= h1 >> 16; |
| |
| return h1; |
| |
| } |
| |
| #endif /* ^__x86_64__ */ |
| #endif |
| |
| #endif /* !_HAVE_HASH_H */ |
| |