diff --git a/components/esm/formid.hpp b/components/esm/formid.hpp index e9416e35c7..9fe89585c2 100644 --- a/components/esm/formid.hpp +++ b/components/esm/formid.hpp @@ -51,10 +51,10 @@ namespace std { size_t operator()(const ESM::FormId& formId) const { - static_assert(sizeof(ESM::FormId) == sizeof(size_t)); - size_t s; - memcpy(&s, &formId, sizeof(size_t)); - return hash()(s); + static_assert(sizeof(ESM::FormId) == sizeof(uint64_t)); + uint64_t s; + memcpy(&s, &formId, sizeof(ESM::FormId)); + return hash()(s); } }; diff --git a/components/misc/strings/algorithm.hpp b/components/misc/strings/algorithm.hpp index 18f72104bd..9b42588780 100644 --- a/components/misc/strings/algorithm.hpp +++ b/components/misc/strings/algorithm.hpp @@ -4,6 +4,7 @@ #include "lower.hpp" #include +#include #include #include #include @@ -88,14 +89,23 @@ namespace Misc::StringUtils constexpr std::size_t operator()(std::string_view str) const { // FNV-1a - std::size_t hash{ 0xcbf29ce484222325ull }; - constexpr std::size_t prime{ 0x00000100000001B3ull }; + std::uint64_t hash{ 0xcbf29ce484222325ull }; + constexpr std::uint64_t prime{ 0x00000100000001B3ull }; for (char c : str) { - hash ^= static_cast(toLower(c)); + hash ^= static_cast(toLower(c)); hash *= prime; } - return hash; + if constexpr (sizeof(std::uint64_t) <= sizeof(std::size_t)) + return hash; + else if constexpr (sizeof(std::uint32_t) == sizeof(std::size_t)) + { + std::uint32_t low = hash & 0xFFFFFFFF; + std::uint32_t high = hash >> 32; + return low ^ high; + } + static_assert(sizeof(std::uint64_t) <= sizeof(std::size_t) || sizeof(std::uint32_t) == sizeof(std::size_t)); + return {}; } };