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
47 lines
1.2 KiB
|
1 week ago
|
#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]);
|
||
|
|
}
|
||
|
|
}
|