#include "SDL_internal.h"
static SDL_INLINE Uint32 murmur_32_scramble(Uint32 k)
{
k *= 0xcc9e2d51;
k = (k << 15) | (k >> 17);
k *= 0x1b873593;
return k;
}
Uint32 SDLCALL SDL_murmur3_32(const void *data, size_t len, Uint32 seed)
{
const Uint8 *bytes = (const Uint8 *)data;
Uint32 hash = seed;
Uint32 k;
if ((((uintptr_t)bytes) & 3) == 0) {
for (size_t i = len >> 2; i--; ) {
k = *(const Uint32 *)bytes;
k = SDL_Swap32LE(k);
bytes += sizeof(Uint32);
hash ^= murmur_32_scramble(k);
hash = (hash << 13) | (hash >> 19);
hash = hash * 5 + 0xe6546b64;
}
} else {
for (size_t i = len >> 2; i--; ) {
SDL_memcpy(&k, bytes, sizeof(Uint32));
k = SDL_Swap32LE(k);
bytes += sizeof(Uint32);
hash ^= murmur_32_scramble(k);
hash = (hash << 13) | (hash >> 19);
hash = hash * 5 + 0xe6546b64;
}
}
size_t left = (len & 3);
if (left) {
k = 0;
for (size_t i = left; i--; ) {
k <<= 8;
k |= bytes[i];
}
hash ^= murmur_32_scramble(k);
}
hash ^= len;
hash ^= hash >> 16;
hash *= 0x85ebca6b;
hash ^= hash >> 13;
hash *= 0xc2b2ae35;
hash ^= hash >> 16;
return hash;
}