38 inline static constexpr uint32_t FNV_PRIME = 16777619u;
39 inline static constexpr uint32_t FNV_OFFSET_BASIS = 2166136261u;
41 template<std::
size_t N = 256>
42 static constexpr std::array<uint32_t, N> GenerateTableCrc32()
44 constexpr int NumIterations = 8;
45 constexpr uint32_t Polynomial = 0xEDB88320;
47 std::array<uint32_t, N> TableCrc32{};
48 for (
int Byte = 0; Byte < N; ++Byte)
50 uint32_t Crc = (uint32_t)Byte;
51 for (
int i = 0; i < NumIterations; ++i)
53 const int Mask = -((int)Crc & 1);
54 Crc = (Crc >> 1) ^ (Polynomial & Mask);
57 TableCrc32[Byte] = Crc;
62 #if defined(LK_ENGINE_MSVC)
63 inline static const auto TableCrc32 = GenerateTableCrc32<256>();
65 inline static constexpr auto TableCrc32 = GenerateTableCrc32<256>();
67 TableCrc32.size() == 256 &&
68 TableCrc32[1] == 0x77073096 &&
69 TableCrc32[255] == 0x2D02EF8D),
70 "LHash::GenerateTableCrc32 generated an unexpected result");
72 #elif defined(LK_ENGINE_GCC) || defined(LK_ENGINE_CLANG)
73 inline static auto TableCrc32 = GenerateTableCrc32<256>();
78 static constexpr uint32_t Generate(std::string_view String)
83 template<EChecksum Type>
84 static constexpr uint32_t GenerateChecksum(std::string_view String)
119 constexpr uint32_t LHash::GenerateChecksum<EChecksum::Crc32>(std::string_view String)
121 uint32_t Crc = 0xFFFFFFFFu;
122 for (uint32_t Index = 0u;
char Character = String[Index]; Index++)
124 static_assert(std::is_same_v<uint32_t,
decltype(Index)>,
"Invalid type for 'i'");
125 Crc = TableCrc32[(Crc ^ Character) & 0xFF] ^ (Crc >> 8);