49 lines
781 B
C
49 lines
781 B
C
|
/*
|
||
|
* 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;
|
||
|
}
|