/* * Copyright (c) 2022, Meta * * SPDX-License-Identifier: Apache-2.0 */ #include #include 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; }