48 return (x << r) | (x >> (32 - r));
53 return (x << r) | (x >> (64 - r));
56 template<
typename Char>
70 template<
typename Char>
110 k *= 0xFF51AFD7ED558CCDllu;
112 k *= 0xC4CEB9FE1A85EC53llu;
119 template<
typename Char>
122 Char
const* string_data = key.data();
125 ice::u32 const block_byte_size = 4u;
126 ice::u32 const block_num = string_length / block_byte_size;
131 ice::u32 const const_1 = 0xcc9e2d51;
132 ice::u32 const const_2 = 0x1b873593;
135 Char
const* blocks_end = string_data +
static_cast<ice::uptr>(block_num) * block_byte_size;
137 for (
size_t idx = block_num; idx > 0; --idx)
151 Char
const* tail = blocks_end;
155 switch (string_length & 3)
158 k1 ^=
static_cast<ice::u8 const
>(tail[2]) << 16;
161 k1 ^=
static_cast<ice::u8 const
>(tail[1]) << 8;
164 k1 ^=
static_cast<ice::u8 const
>(tail[0]);
173 hash_r1 ^=
static_cast<ice::u32>(string_length);
182 template<
typename Char>
185 Char
const* string_data = key.data();
188 ice::u32 const block_byte_size = 16u;
189 ice::u32 const block_num = string_length / block_byte_size;
199 ice::u32 const const_1 = 0x239b961b;
200 ice::u32 const const_2 = 0xab0e9789;
201 ice::u32 const const_3 = 0x38b34ae5;
202 ice::u32 const const_4 = 0xa1e38b93;
204 Char
const* blocks_end = string_data +
static_cast<ice::uptr>(block_num) * block_byte_size;
206 for (
size_t idx = block_num; idx > 0; --idx)
217 hash_r1 = hash_r1 * 5 + 0x561ccd1b;
223 hash_r2 = hash_r2 * 5 + 0x0bcaa747;
229 hash_r3 = hash_r3 * 5 + 0x96cd1c35;
235 hash_r4 = hash_r4 * 5 + 0x32ac3b17;
241 Char
const* tail = blocks_end;
248 switch (string_length & 15)
250 case 15: k4 ^=
static_cast<ice::u8 const
>(tail[14]) << 16;
252 case 14: k4 ^=
static_cast<ice::u8 const
>(tail[13]) << 8;
254 case 13: k4 ^=
static_cast<ice::u8 const
>(tail[12]) << 0;
259 case 12: k3 ^=
static_cast<ice::u8 const
>(tail[11]) << 24;
261 case 11: k3 ^=
static_cast<ice::u8 const
>(tail[10]) << 16;
263 case 10: k3 ^=
static_cast<ice::u8 const
>(tail[9]) << 8;
265 case 9: k3 ^=
static_cast<ice::u8 const
>(tail[8]) << 0;
270 case 8: k2 ^=
static_cast<ice::u8 const
>(tail[7]) << 24;
272 case 7: k2 ^=
static_cast<ice::u8 const
>(tail[6]) << 16;
274 case 6: k2 ^=
static_cast<ice::u8 const
>(tail[5]) << 8;
276 case 5: k2 ^=
static_cast<ice::u8 const
>(tail[4]) << 0;
281 case 4: k1 ^=
static_cast<ice::u8 const
>(tail[3]) << 24;
283 case 3: k1 ^=
static_cast<ice::u8 const
>(tail[2]) << 16;
285 case 2: k1 ^=
static_cast<ice::u8 const
>(tail[1]) << 8;
287 case 1: k1 ^=
static_cast<ice::u8 const
>(tail[0]) << 0;
295 hash_r1 ^= string_length;
296 hash_r2 ^= string_length;
297 hash_r3 ^= string_length;
298 hash_r4 ^= string_length;
319 return mm3_x86_h128{ .h = { hash_r1, hash_r2, hash_r3, hash_r4 } };
324 template<
typename Char>
327 Char
const* string_data = key.data();
328 ice::u64 const string_length = key.length();
330 ice::u64 const block_byte_size = 16u;
331 ice::u64 const block_num = string_length / block_byte_size;
339 ice::u64 const const_1 = 0x87c37b91114253d5llu;
340 ice::u64 const const_2 = 0x4cf5ad432745937fllu;
342 Char
const* blocks_beg = string_data;
344 for (
ice::u32 idx = 0; idx < block_num; ++idx)
353 hash_r1 = hash_r1 * 5 + 0x52dce729;
359 hash_r2 = hash_r2 * 5 + 0x38495ab5;
365 Char
const* tail = blocks_beg + block_num * block_byte_size;
370 switch (string_length & 15)
372 case 15: k2 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[14])) << 48;
374 case 14: k2 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[13])) << 40;
376 case 13: k2 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[12])) << 32;
378 case 12: k2 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[11])) << 24;
380 case 11: k2 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[10])) << 16;
382 case 10: k2 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[9])) << 8;
384 case 9: k2 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[8])) << 0;
389 case 8: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[7])) << 56;
391 case 7: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[6])) << 48;
393 case 6: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[5])) << 40;
395 case 5: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[4])) << 32;
397 case 4: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[3])) << 24;
399 case 3: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[2])) << 16;
401 case 2: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[1])) << 8;
403 case 1: k1 ^=
static_cast<ice::u64 const
>(
static_cast<ice::u8 const
>(tail[0])) << 0;
411 hash_r1 ^= string_length;
412 hash_r2 ^= string_length;
Definition murmur3.hxx:44
constexpr auto cexpr_fmix32(ice::u32 h) noexcept -> ice::u32
Definition murmur3.hxx:95
constexpr ice::u64 cexpr_fmix64(ice::u64 k) noexcept
Definition murmur3.hxx:107
constexpr auto cexpr_murmur3_x86_128(std::basic_string_view< Char > key, ice::u32 seed) noexcept -> mm3_x86_h128
Definition murmur3.hxx:183
constexpr auto cexpr_rotl32(ice::u32 x, ice::i8 r) noexcept -> ice::u32
Definition murmur3.hxx:46
constexpr auto cexpr_block_x64(Char const *data) noexcept -> ice::u64
Definition murmur3.hxx:71
constexpr auto cexpr_murmur3_x86_32(std::basic_string_view< Char > key, ice::u32 seed) noexcept -> mm3_x86_h32
Definition murmur3.hxx:120
constexpr auto cexpr_murmur3_x64_128(std::basic_string_view< Char > key, ice::u32 seed) noexcept -> mm3_x64_h128
Definition murmur3.hxx:325
constexpr auto cexpr_block_x32(Char const *data) noexcept -> ice::u32
Definition murmur3.hxx:57
constexpr auto cexpr_rotl64(ice::u64 x, ice::i8 r) noexcept -> ice::u64
Definition murmur3.hxx:51
Definition murmur3.hxx:18
constexpr auto cexpr_murmur3_x86_32(std::u8string_view key, ice::u32 seed) noexcept -> mm3_x86_h32
Definition murmur3.hxx:428
constexpr auto cexpr_murmur3_x86_128(std::u8string_view key, ice::u32 seed) noexcept -> mm3_x86_h128
Definition murmur3.hxx:433
constexpr auto cexpr_murmur3_x64_128(std::u8string_view key, ice::u32 seed) noexcept -> mm3_x64_h128
Definition murmur3.hxx:438
std::int8_t i8
Definition types.hxx:19
std::uint64_t u64
Definition types.hxx:27
std::uintptr_t uptr
Definition types.hxx:29
std::uint32_t u32
Definition types.hxx:26
std::uint8_t u8
Definition types.hxx:24
Definition murmur3.hxx:31
ice::u64 h[2]
Definition murmur3.hxx:32
Definition murmur3.hxx:26
ice::u32 h[4]
Definition murmur3.hxx:27
Definition murmur3.hxx:21
ice::u32 h[1]
Definition murmur3.hxx:22