github.com/moontrade/nogc@v0.1.7/collections/tree/hash.h (about) 1 #ifndef HASH_H 2 #define HASH_H 3 4 #pragma once 5 6 #include <cstddef> 7 #include <cstdint> 8 #include <string> 9 #include <type_traits> 10 11 static const char* HashName = "FNV1a"; 12 13 static size_t fnv1a(uint8_t const* data, size_t size) { 14 #if SIZE_MAX == UINT32_MAX 15 static constexpr size_t FNV_offset_basis = UINT64_C(14695981039346656037); 16 static constexpr size_t FNV_prime = UINT64_C(1099511628211); 17 #else 18 static constexpr size_t FNV_offset_basis = UINT32_C(2166136261); 19 static constexpr size_t FNV_prime = UINT32_C(16777619); 20 #endif 21 size_t val = FNV_offset_basis; 22 for (size_t i = 0; i < size; ++i) { 23 val ^= static_cast<size_t>(data[i]); 24 val *= FNV_prime; 25 } 26 return val; 27 } 28 29 // Visual Studio uses a FNV1a implementation. 30 template <typename T> 31 struct Hash { 32 size_t operator()(T const& key) const { 33 return fnv1a(reinterpret_cast<uint8_t const*>(&key), sizeof(T)); 34 } 35 }; 36 37 // Visual Studio uses a FNV1a implementation. 38 template <> 39 struct Hash<std::string> { 40 size_t operator()(std::string const& key) const { 41 return fnv1a(reinterpret_cast<uint8_t const*>(key.data()), key.size()); 42 } 43 }; 44 45 #endif //HASH_H