diff options
Diffstat (limited to 'compat/int-hash.cpp')
-rw-r--r-- | compat/int-hash.cpp | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/compat/int-hash.cpp b/compat/int-hash.cpp index 00f2e474..72c38179 100644 --- a/compat/int-hash.cpp +++ b/compat/int-hash.cpp @@ -3,35 +3,31 @@ namespace floormat { -size_t int_hash(uint32_t x) noexcept +template<typename T, T offset_basis, T prime> +static CORRADE_ALWAYS_INLINE +T FNVHash(const char* str, size_t size) { - if constexpr(sizeof(size_t) == 4) + const auto* end = str + size; + T hash = offset_basis; + for (; str != end; ++str) { - // by Chris Wellons <https://nullprogram.com/blog/2018/07/31/> - - x ^= x >> 15; - x *= 0x2c1b3c6dU; - x ^= x >> 12; - x *= 0x297a2d39U; - x ^= x >> 15; - - return x; + hash *= prime; + hash ^= (uint8_t)*str; } + return hash; +} + +size_t int_hash(uint32_t x) noexcept +{ + if constexpr(sizeof(size_t) == 4) + return FNVHash<uint32_t, 0x811c9dc5u, 0x01000193u>((const char*)&x, 4); else return int_hash(uint64_t(x)); } size_t int_hash(uint64_t x) noexcept { - // NASAM by Pelle Evensen <https://mostlymangling.blogspot.com/2020/01/nasam-not-another-strange-acronym-mixer.html> - - x ^= std::rotr(x, 25) ^ std::rotr(x, 47); - x *= 0x9E6C63D0676A9A99UL; - x ^= x >> 23 ^ x >> 51; - x *= 0x9E6D62D06F6A9A9BUL; - x ^= x >> 23 ^ x >> 51; - - return x; + return FNVHash<uint64_t, 0xcbf29ce484222325u, 0x100000001b3u>((const char*)&x, 8); } } // namespace floormat |