| /* |
| * Copyright (c) 2022, Meta |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| static inline uint32_t murmur_32_scramble(uint32_t k) |
| { |
| k *= 0xcc9e2d51; |
| k = (k << 15) | (k >> 17); |
| k *= 0x1b873593; |
| |
| return k; |
| } |
| |
| uint32_t sys_hash32_murmur3(const char *str, size_t n) |
| { |
| uint32_t k; |
| /* seed of 0 */ |
| uint32_t h = 0; |
| const size_t len = n; |
| |
| for (; n >= sizeof(uint32_t); n -= sizeof(uint32_t), str += sizeof(uint32_t)) { |
| k = *(const uint32_t *)str; |
| h ^= murmur_32_scramble(k); |
| h = (h << 13) | (h >> 19); |
| h = h * 5 + 0xe6546b64; |
| } |
| |
| for (k = 0; n != 0; --n, ++str) { |
| k <<= 8; |
| k |= *str; |
| } |
| |
| h ^= murmur_32_scramble(k); |
| |
| h ^= len; |
| h ^= h >> 16; |
| h *= 0x85ebca6b; |
| h ^= h >> 13; |
| h *= 0xc2b2ae35; |
| h ^= h >> 16; |
| |
| return h; |
| } |