17[[nodiscard]]
inline size_t hash_mix_two(
size_t hash1,
size_t hash2)
noexcept
19 ttlet
round = _mm_set_epi64x(0x123456789abcdef0ULL, 0x0fedcba987654321ULL);
21 auto hash = _mm_set_epi64x(hash1, hash2);
22 hash = _mm_aesenc_si128(hash, round);
23 hash = _mm_aesenc_si128(hash, round);
26 _mm_storeu_si64(buffer.
data(), hash);
30template<
typename First,
typename Second,
typename... Args>
31[[nodiscard]]
size_t hash_mix(First &&first, Second &&second, Args &&... args)
noexcept {
32 if constexpr (
sizeof...(args) == 0) {
34 std::hash<std::remove_cvref_t<First>>{}(std::forward<First>(first)),
35 std::hash<std::remove_cvref_t<Second>>{}(std::forward<Second>(second))
39 std::hash<std::remove_cvref_t<First>>{}(std::forward<First>(first)),
40 hash_mix(std::forward<Second>(second), std::forward<Args>(args)...)