Temporary repository used to save branch code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

47 lines
1.2 KiB

#include <array>
#include <cstddef>
#include <unordered_hash.hpp>
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<size_t, 4> 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]);
}
}