18#ifndef TRINITYCORE_HASH_H
19#define TRINITYCORE_HASH_H
32 seed = seed + 0x9E3779B9 + std::hash<T>()(val);
34 if constexpr (
sizeof(std::size_t) == 8)
36 constexpr std::size_t m = 0xE9846AF9B1A615D;
46 constexpr std::size_t m1 = 0x21F0AAAD;
47 constexpr std::size_t m2 = 0x735A2D97;
57 template <std::
size_t>
63 static constexpr std::uint32_t Basis = 0x811C9DC5u;
64 static constexpr std::uint32_t Prime = 0x01000193u;
70 static constexpr std::uint64_t Basis = 0xCBF29CE484222325ull;
71 static constexpr std::uint64_t Prime = 0x00000100000001B3ull;
75 concept HashablePrimitive = std::is_arithmetic_v<T> || std::is_enum_v<T> || std::is_pointer_v<T>;
77 template <
typename T = std::
size_t>
84 template <HashablePrimitive V, std::
size_t Extent>
85 inline constexpr void UpdateData(std::span<V, Extent> data)
noexcept
89 if (std::is_constant_evaluated())
91 static_assert(std::is_integral_v<V> || std::is_enum_v<V>,
"Only integral types can be hashed at compile time");
95 for (std::size_t i = 0; i <
sizeof(V); ++i)
97 hash ^= (
static_cast<T
>(c) >> (i * 8)) & 0xFF;
98 hash *= Constants::Prime;
104 std::byte
const* c =
reinterpret_cast<std::byte const*
>(data.data());
105 std::byte
const* end = c + data.size_bytes();
108 hash ^=
static_cast<T
>(*c);
109 hash *= Constants::Prime;
117 template <HashablePrimitive V>
123 template <
typename V>
124 inline constexpr void UpdateData(V
const& data)
noexcept requires requires { std::span(data); }
129 template <HashablePrimitive V, std::
size_t Extent>
130 inline static constexpr std::size_t
GetHash(std::span<V, Extent> data)
noexcept
137 template <HashablePrimitive V>
138 inline static constexpr std::size_t
GetHash(V data)
noexcept
143 template <
typename V>
144 inline static constexpr std::size_t
GetHash(V
const& data)
noexcept requires requires { std::span(data); }
150 template <
typename T,
typename Hash = std::hash<T>>
159template <
typename K,
typename V>
160struct std::hash<
std::pair<K, V>>
164 std::size_t hashVal = std::hash<K>()(p.first);
void hash_combine(std::size_t &seed, T const &val)
constexpr void UpdateData(std::span< V, Extent > data) noexcept
static constexpr std::size_t GetHash(V const &data) noexcept
static constexpr std::size_t GetHash(std::span< V, Extent > data) noexcept
static constexpr std::size_t GetHash(V data) noexcept
constexpr void UpdateData(V data) noexcept
constexpr void UpdateData(V const &data) noexcept
std::size_t operator()(std::pair< K, V > const &p) const