20 #ifndef ANTKEEPER_UTILITY_HASH_FNV1A_HPP
21 #define ANTKEEPER_UTILITY_HASH_FNV1A_HPP
25 #include <string_view>
45 template <std::
unsigned_
integral HashT, std::
integral DataT>
46 [[nodiscard]] constexpr HashT
fnv1a(std::span<const DataT> data, HashT
offset, HashT prime) noexcept
50 if constexpr (
sizeof(DataT) == 1)
58 for (std::size_t j = 0; j <
sizeof(DataT); ++j)
78 template <std::
integral DataT>
79 [[nodiscard]] constexpr std::uint32_t
fnv1a32(std::span<const DataT> data) noexcept
82 constexpr std::uint32_t
offset = 2166136261;
85 constexpr std::uint32_t prime = 16777619;
87 return fnv1a<std::uint32_t, DataT>(data,
offset, prime);
99 template <std::
integral DataT>
100 [[nodiscard]] constexpr std::uint64_t
fnv1a64(std::span<const DataT> data) noexcept
103 constexpr std::uint64_t
offset = 14695981039346656037ULL;
106 constexpr std::uint64_t prime = 1099511628211ULL;
108 return fnv1a<std::uint64_t, DataT>(data,
offset, prime);
139 constexpr
explicit(
false)
fnv1a32_t(
const char*
string) noexcept:
140 value{fnv1a32<char>({string, std::string_view(
string).length()})}
142 constexpr
explicit(
false)
fnv1a32_t(
const wchar_t*
string) noexcept:
143 value{fnv1a32<wchar_t>({string, std::wstring_view(
string).length()})}
145 constexpr
explicit(
false)
fnv1a32_t(
const char8_t*
string) noexcept:
146 value{fnv1a32<char8_t>({string, std::u8string_view(
string).length()})}
148 constexpr
explicit(
false)
fnv1a32_t(
const char16_t*
string) noexcept:
149 value{fnv1a32<char16_t>({string, std::u16string_view(
string).length()})}
151 constexpr
explicit(
false)
fnv1a32_t(
const char32_t*
string) noexcept:
152 value{fnv1a32<char32_t>({string, std::u32string_view(
string).length()})}
161 [[nodiscard]]
inline constexpr
operator value_type() const noexcept
169 static_assert(
sizeof(
fnv1a32_t) ==
sizeof(std::uint32_t));
195 constexpr
explicit(
false)
fnv1a64_t(
const char*
string) noexcept:
196 value{fnv1a64<char>({string, std::string_view(
string).length()})}
198 constexpr
explicit(
false)
fnv1a64_t(
const wchar_t*
string) noexcept:
199 value{fnv1a64<wchar_t>({string, std::wstring_view(
string).length()})}
201 constexpr
explicit(
false)
fnv1a64_t(
const char8_t*
string) noexcept:
202 value{fnv1a64<char8_t>({string, std::u8string_view(
string).length()})}
204 constexpr
explicit(
false)
fnv1a64_t(
const char16_t*
string) noexcept:
205 value{fnv1a64<char16_t>({string, std::u16string_view(
string).length()})}
207 constexpr
explicit(
false)
fnv1a64_t(
const char32_t*
string) noexcept:
208 value{fnv1a64<char32_t>({string, std::u32string_view(
string).length()})}
217 [[nodiscard]]
inline constexpr
operator value_type() const noexcept
225 static_assert(
sizeof(
fnv1a64_t) ==
sizeof(std::uint64_t));
243 [[nodiscard]] consteval std::uint32_t
operator"" _fnv1a32(
const char*
string, std::size_t
length) noexcept
245 return hash::fnv1a32<char>({string,
length});
248 [[nodiscard]] consteval std::uint32_t
operator"" _fnv1a32(
const wchar_t*
string, std::size_t
length) noexcept
250 return hash::fnv1a32<wchar_t>({string,
length});
253 [[nodiscard]] consteval std::uint32_t
operator"" _fnv1a32(
const char8_t*
string, std::size_t
length) noexcept
255 return hash::fnv1a32<char8_t>({string,
length});
258 [[nodiscard]] consteval std::uint32_t
operator"" _fnv1a32(
const char16_t*
string, std::size_t
length) noexcept
260 return hash::fnv1a32<char16_t>({string,
length});
263 [[nodiscard]] consteval std::uint32_t
operator"" _fnv1a32(
const char32_t*
string, std::size_t
length) noexcept
265 return hash::fnv1a32<char32_t>({string,
length});
278 [[nodiscard]] consteval std::uint64_t
operator"" _fnv1a64(
const char*
string, std::size_t
length) noexcept
280 return hash::fnv1a64<char>({string,
length});
283 [[nodiscard]] consteval std::uint64_t
operator"" _fnv1a64(
const wchar_t*
string, std::size_t
length) noexcept
285 return hash::fnv1a64<wchar_t>({string,
length});
288 [[nodiscard]] consteval std::uint64_t
operator"" _fnv1a64(
const char8_t*
string, std::size_t
length) noexcept
290 return hash::fnv1a64<char8_t>({string,
length});
293 [[nodiscard]] consteval std::uint64_t
operator"" _fnv1a64(
const char16_t*
string, std::size_t
length) noexcept
295 return hash::fnv1a64<char16_t>({string,
length});
298 [[nodiscard]] consteval std::uint64_t
operator"" _fnv1a64(
const char32_t*
string, std::size_t
length) noexcept
300 return hash::fnv1a64<char32_t>({string,
length});
315 [[nodiscard]]
inline constexpr
bool operator==(const ::hash::fnv1a32_t& lhs, const ::hash::fnv1a32_t& rhs) noexcept
317 return lhs.value == rhs.value;
319 [[nodiscard]]
inline constexpr
bool operator==(const ::hash::fnv1a64_t& lhs, const ::hash::fnv1a64_t& rhs) noexcept
321 return lhs.value == rhs.value;
329 [[nodiscard]]
inline constexpr
bool operator<(const ::hash::fnv1a32_t& lhs, const ::hash::fnv1a32_t& rhs) noexcept
331 return lhs.value < rhs.value;
333 [[nodiscard]]
inline constexpr
bool operator<(const ::hash::fnv1a64_t& lhs, const ::hash::fnv1a64_t& rhs) noexcept
335 return lhs.value < rhs.value;
344 [[nodiscard]]
inline constexpr std::size_t
operator()(const ::hash::fnv1a32_t&
hash)
const noexcept
346 return static_cast<std::size_t
>(
hash.value);
353 [[nodiscard]]
inline constexpr std::size_t
operator()(const ::hash::fnv1a64_t&
hash)
const noexcept
355 return static_cast<std::size_t
>(
hash.value);
constexpr bool operator==(const ::hash::fnv1a32_t &lhs, const ::hash::fnv1a32_t &rhs) noexcept
Compares two FNV-1a hash values for equality.
constexpr bool operator<(const ::hash::fnv1a32_t &lhs, const ::hash::fnv1a32_t &rhs) noexcept
Checks if one FNV-1a hash value is less than another.
User-defined literals for compile-time string hashing.
Distinct hash value types for different hash algorithms.
constexpr std::uint32_t fnv1a32(std::span< const DataT > data) noexcept
32-bit FNV-1a hash function.
constexpr std::uint64_t fnv1a64(std::span< const DataT > data) noexcept
64-bit FNV-1a hash function.
constexpr HashT fnv1a(std::span< const DataT > data, HashT offset, HashT prime) noexcept
FNV-1a hash function.
T length(const quaternion< T > &q)
Calculates the length of a quaternion.
T offset(T longitude)
Calculates the UTC offset at a given longitude.
32-bit FNV-1a hash value.
fnv1a32_t()=default
Constructs a 32-bit FNV-1a hash value.
value_type value
32-bit FNV-1a hash value.
std::uint32_t value_type
Hash value type.
64-bit FNV-1a hash value.
value_type value
64-bit FNV-1a hash value.
fnv1a64_t()=default
Constructs a 64-bit FNV-1a hash value.
std::uint64_t value_type
Hash value type.
constexpr std::size_t operator()(const ::hash::fnv1a32_t &hash) const noexcept
constexpr std::size_t operator()(const ::hash::fnv1a64_t &hash) const noexcept