37static constexpr uint64_t PRIME1 = 0x9E3779B185EBCA87ULL;
38static constexpr uint64_t PRIME2 = 0xC2B2AE3D27D4EB4FULL;
39static constexpr uint64_t PRIME3 = 0x165667B19E3779F9ULL;
40static constexpr uint64_t PRIME4 = 0x85EBCA77C2B2AE63ULL;
41static constexpr uint64_t PRIME5 = 0x27D4EB2F165667C5ULL;
52inline constexpr uint64_t
rotl64(uint64_t v,
int r) {
54 return (v << r) | (v >> ((64 - r) & 63));
63 std::memcpy(&v, p, 8);
66#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
67 v = __builtin_bswap64(v);
68#elif defined(_MSC_VER)
72#elif !defined(__BYTE_ORDER__)
73# error "Cannot determine endianness — define __BYTE_ORDER__"
84 std::memcpy(&v, p, 4);
85#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
86 v = __builtin_bswap32(v);
87#elif defined(_MSC_VER)
90#elif !defined(__BYTE_ORDER__)
91# error "Cannot determine endianness — define __BYTE_ORDER__"
107inline constexpr uint64_t
round(uint64_t acc, uint64_t lane) {
108 acc += lane * PRIME2;
123 acc = acc * PRIME1 + PRIME4;
159inline uint64_t
hash64(
const void* data,
size_t length, uint64_t seed = 0) {
160 using namespace detail;
162 const auto* p =
static_cast<const uint8_t*
>(data);
163 const auto* end = p + length;
171 uint64_t v1 = seed + PRIME1 + PRIME2;
172 uint64_t v2 = seed + PRIME2;
174 uint64_t v4 = seed - PRIME1;
179 const auto* stripe_end = end - 31;
181 v1 = round(v1, read_u64_le(p)); p += 8;
182 v2 = round(v2, read_u64_le(p)); p += 8;
183 v3 = round(v3, read_u64_le(p)); p += 8;
184 v4 = round(v4, read_u64_le(p)); p += 8;
185 }
while (p < stripe_end);
195 h = merge_accumulator(h, v1);
196 h = merge_accumulator(h, v2);
197 h = merge_accumulator(h, v3);
198 h = merge_accumulator(h, v4);
209 h +=
static_cast<uint64_t
>(length);
216 while (p + 8 <= end) {
217 uint64_t lane = read_u64_le(p);
219 h = rotl64(h, 27) * PRIME1 + PRIME4;
225 uint64_t lane =
static_cast<uint64_t
>(read_u32_le(p));
227 h = rotl64(h, 23) * PRIME2 + PRIME3;
233 uint64_t lane =
static_cast<uint64_t
>(*p);
235 h = rotl64(h, 11) * PRIME1;