13#ifndef M5_UTILITY_MURMURHASH3_HPP
14#define M5_UTILITY_MURMURHASH3_HPP
31constexpr uint32_t mul(
const uint32_t v,
const uint32_t vv)
36constexpr uint32_t xor_value(
const uint32_t v,
const uint32_t x)
41constexpr uint32_t shift_right(
const uint32_t v,
const uint8_t s)
46constexpr uint32_t xor_by_shift_right(
const uint32_t v,
const uint32_t s)
48 return xor_value(v, shift_right(v, s));
51constexpr uint32_t str2uint32_little(
const char* str,
const size_t getc =
sizeof(uint32_t), uint32_t v = 0)
53 return getc ? str2uint32_little(str, getc - 1, (v << 8) | str[getc - 1]) : v;
56constexpr uint32_t str2uint32_big(
const char* str,
const size_t getc =
sizeof(uint32_t), uint32_t v = 0)
58 return getc ? str2uint32_big(str + 1, getc - 1, (v << 8) | *str) : v;
62template <u
int32_t Endian>
63constexpr typename std::enable_if<Endian, uint32_t>::type str2uint32(
const char* str,
64 const size_t getc =
sizeof(uint32_t),
67 return str2uint32_little(str, getc, v);
70template <u
int32_t Endian>
71constexpr typename std::enable_if<!Endian, uint32_t>::type str2uint32(
const char* str,
72 const size_t getc =
sizeof(uint32_t),
75 return str2uint32_big(str, getc, v);
78constexpr uint32_t scramble_sub(
const uint32_t k)
80 return (k << 15) | (k >> 17);
83constexpr uint32_t scramble(
const uint32_t k,
const uint32_t h)
85 return h ^ mul(scramble_sub(mul(k, 0xcc9e2d51)), 0x1b873593);
88constexpr uint32_t group_of_4_sub_3(
const uint32_t h)
90 return h * 5 + 0xe6546b64;
93constexpr uint32_t group_of_4_sub_2(
const uint32_t h)
95 return (h << 13) | (h >> 19);
98constexpr uint32_t group_of_4_sub_1(
const uint32_t k,
const uint32_t h)
100 return group_of_4_sub_3(group_of_4_sub_2(scramble(k, h)));
103constexpr uint32_t group_of_4(
const char* str,
const size_t len,
const uint32_t h = 0)
105 return len ? group_of_4(str +
sizeof(uint32_t), len - 1, group_of_4_sub_1(str2uint32<m5::endian::little>(str), h))
109constexpr uint32_t rest(
const char* str,
const size_t len,
const uint32_t h = 0)
111 return len ? scramble(str2uint32<m5::endian::little>(str, len), h) : h;
114constexpr uint32_t finalize(uint32_t h,
size_t len)
116 return xor_by_shift_right(
117 mul(xor_by_shift_right(mul(xor_by_shift_right(xor_value(h, len), 16), 0x85ebca6b), 13), 0xc2b2ae35), 16);
127constexpr uint32_t
calculate(
const char* str,
const size_t len)
129 return finalize(rest(str + ((len >> 2) *
sizeof(uint32_t)), (len & 3), group_of_4(str, len >> 2)), len);
140constexpr uint32_t
operator"" _mmh3(
const char* str,
const size_t len)
150uint32_t calculate(
const char* str);
Compile-time endian identification.
uint32_t calculate(const char *str)
Calculate MurmurHash3 from string.
Definition murmurhash3.cpp:16
Top level namespace of M5.
Definition bit_segment.hpp:17