LkEngine 0.1.2
 
Loading...
Searching...
No Matches
Hash.h
1#pragma once
2
4
5namespace LkEngine {
6
17 enum class EHash
18 {
19 None = 0,
20 FNV, /* Fowler-Noll-Vo */
21 };
22
26 enum class EChecksum
27 {
28 None = 0,
29 Crc32,
30 };
31
35 class LHash
36 {
37 private:
38 inline static constexpr uint32_t FNV_PRIME = 16777619u;
39 inline static constexpr uint32_t FNV_OFFSET_BASIS = 2166136261u;
40
41 template<std::size_t N = 256>
42 static constexpr std::array<uint32_t, N> GenerateTableCrc32()
43 {
44 constexpr int NumIterations = 8;
45 constexpr uint32_t Polynomial = 0xEDB88320;
46
47 std::array<uint32_t, N> TableCrc32{};
48 for (int Byte = 0; Byte < N; ++Byte)
49 {
50 uint32_t Crc = (uint32_t)Byte;
51 for (int i = 0; i < NumIterations; ++i)
52 {
53 const int Mask = -((int)Crc & 1);
54 Crc = (Crc >> 1) ^ (Polynomial & Mask);
55 }
56
57 TableCrc32[Byte] = Crc;
58 }
59
60 return TableCrc32;
61 }
62 #if defined(LK_ENGINE_MSVC)
63 inline static const auto TableCrc32 = GenerateTableCrc32<256>();
64 #if 0
65 inline static constexpr auto TableCrc32 = GenerateTableCrc32<256>();
66 static_assert((
67 TableCrc32.size() == 256 &&
68 TableCrc32[1] == 0x77073096 &&
69 TableCrc32[255] == 0x2D02EF8D),
70 "LHash::GenerateTableCrc32 generated an unexpected result");
71 #endif
72 #elif defined(LK_ENGINE_GCC) || defined(LK_ENGINE_CLANG)
73 inline static auto TableCrc32 = GenerateTableCrc32<256>();
74 #endif
75
76 public:
77 template<EHash Type>
78 static constexpr uint32_t Generate(std::string_view String)
79 {
80 return 0;
81 }
82
83 template<EChecksum Type>
84 static constexpr uint32_t GenerateChecksum(std::string_view String)
85 {
86 return 0;
87 }
88
89 };
90
97 template<>
98 constexpr uint32_t LHash::Generate<EHash::FNV>(std::string_view String)
99 {
100 const std::size_t Length = String.length();
101 const char* Data = String.data();
102
103 uint32_t Hash = FNV_OFFSET_BASIS;
104 for (std::size_t i = 0; i < Length; i++)
105 {
106 Hash ^= *Data++;
107 Hash *= FNV_PRIME;
108 }
109 Hash ^= '\0';
110 Hash *= FNV_PRIME;
111
112 return Hash;
113 }
114
118 template<>
119 constexpr uint32_t LHash::GenerateChecksum<EChecksum::Crc32>(std::string_view String)
120 {
121 uint32_t Crc = 0xFFFFFFFFu;
122 for (uint32_t Index = 0u; char Character = String[Index]; Index++)
123 {
124 static_assert(std::is_same_v<uint32_t, decltype(Index)>, "Invalid type for 'i'");
125 Crc = TableCrc32[(Crc ^ Character) & 0xFF] ^ (Crc >> 8);
126 }
127
128 return ~Crc;
129 }
130
133}
Core header.
Definition Hash.h:36
Definition Asset.h:11