#include #include #include namespace detail { static inline size_t rtol_64(size_t val, size_t shift) { return (val >> shift) | (val << (64 - shift)); } static inline size_t mix_last_64(size_t seed, size_t h) { h *= 0x87c37b91114253d5L; h = rtol_64(h, 31); h *= 0x4cf5ad432745937fL; return seed ^ h; } static inline size_t mix_64(size_t seed, size_t h) { h = mix_last_64(seed, h); h = rtol_64(h, 27); return h * 5 + 0x52dce729; } static inline size_t avalanche_64(size_t h) { h ^= h >> 33; h *= 0xff51afd7ed558ccdL; h ^= h >> 33; h *= 0xc4ceb9fe1a85ec53L; h ^= h >> 33; return h; } size_t unordered_hash_32(uint32_t* data, size_t length, size_t seed) { std::array intermediate{}; ispc::pre_unordered_hash_32bit(data, length, intermediate.data()); seed = mix_64(seed, intermediate[0]); seed = mix_64(seed, intermediate[1]); seed = mix_last_64(seed, intermediate[2]); return avalanche_64(seed ^ intermediate[3]); } }