Foundation
Loading...
Searching...
No Matches
Hash.hpp
Go to the documentation of this file.
1#pragma once
2#include <bit>
3#include <concepts>
4#include <cstddef>
5#include <cstdint>
6#include <type_traits>
7
8namespace Foundation::Core
9{
10inline constexpr uint64_t kFNV1a64OffsetBasis = 14695981039346656037ull;
11inline constexpr uint64_t kFNV1a64Prime = 1099511628211ull;
12
13[[nodiscard]] constexpr uint64_t FNV1a64CombineByte(uint64_t hash, uint8_t value) noexcept
14{
15 return (hash ^ value) * kFNV1a64Prime;
16}
17
18[[nodiscard]] inline uint64_t FNV1a64CombineBytes(uint64_t hash, void const* data, size_t size) noexcept
19{
20 auto bytes = static_cast<uint8_t const*>(data);
21 for (size_t i = 0; i < size; ++i)
22 hash = FNV1a64CombineByte(hash, bytes[i]);
23 return hash;
24}
25
26template<std::integral T>
27[[nodiscard]] constexpr uint64_t FNV1a64Combine(uint64_t hash, T value) noexcept
28{
29 if constexpr (std::same_as<T, bool>)
30 return FNV1a64CombineByte(hash, static_cast<uint8_t>(value));
31 else
32 {
33 using U = std::make_unsigned_t<T>;
34 U bits = static_cast<U>(value);
35 for (size_t i = 0; i < sizeof(U); ++i)
36 hash = FNV1a64CombineByte(hash, static_cast<uint8_t>(bits >> (i * 8u)));
37 return hash;
38 }
39}
40
41template<typename T>
42 requires std::is_enum_v<T>
43[[nodiscard]] constexpr uint64_t FNV1a64Combine(uint64_t hash, T value) noexcept
44{
45 return FNV1a64Combine(hash, static_cast<std::underlying_type_t<T>>(value));
46}
47
48[[nodiscard]] constexpr uint64_t FNV1a64Combine(uint64_t hash, float value) noexcept
49{
50 return FNV1a64Combine(hash, std::bit_cast<uint32_t>(value));
51}
52
53[[nodiscard]] constexpr uint64_t FNV1a64Combine(uint64_t hash, double value) noexcept
54{
55 return FNV1a64Combine(hash, std::bit_cast<uint64_t>(value));
56}
57
58template <typename... T>
59[[nodiscard]] constexpr uint64_t FNV1a64(T... values) noexcept
60{
61 uint64_t hash = kFNV1a64OffsetBasis;
62 ((hash = FNV1a64Combine(hash, values)), ...);
63 return hash;
64}
65
66template <typename T>
67[[nodiscard]] constexpr uint64_t FNV1a64(T* data, size_t size) noexcept
68{
69 return FNV1a64CombineBytes(kFNV1a64OffsetBasis, data, size);
70}
71} // namespace Foundation::Core
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:6
uint64_t FNV1a64CombineBytes(uint64_t hash, void const *data, size_t size) noexcept
Definition Hash.hpp:18
constexpr uint64_t FNV1a64Combine(uint64_t hash, T value) noexcept
Definition Hash.hpp:27
constexpr uint64_t kFNV1a64Prime
Definition Hash.hpp:11
constexpr uint64_t FNV1a64(Span< const T > span) noexcept
Definition Container.hpp:509
constexpr uint64_t kFNV1a64OffsetBasis
Definition Hash.hpp:10
constexpr uint64_t FNV1a64CombineByte(uint64_t hash, uint8_t value) noexcept
Definition Hash.hpp:13