#pragma once #include "tl/detail/prologue.h" #include #include namespace tl { //case insensitive murmur hash. Used for case insensitive strings //uint32_t murmur32_ci(const void* buffer, size_t size, uint32_t seed); //uint32_t murmur32_ci(const char* c_str, uint32_t seed); TL_API uint32_t murmur32(const void* buffer, size_t size, uint32_t seed); TL_API uint64_t murmur64(const void* buffer, size_t size, uint32_t seed); TL_API uint64_t murmur64_seed64(const void* buffer, size_t size, uint64_t seed); TL_API uint32_t murmur32(const char* c_str, uint32_t seed); TL_API uint64_t murmur64(const char* c_str, uint32_t seed); TL_API uint32_t murmur_unaligned32(const char* c_str, uint32_t seed); TL_API uint64_t murmur_unaligned64(const char* c_str, uint32_t seed); TL_API uint32_t murmur_unaligned32(const void* i_buffer, size_t i_size, uint32_t i_seed); TL_API uint64_t murmur_unaligned64(const void* i_buffer, size_t i_size, uint64_t i_seed); //templated interface for metaprogramming //buffer + size hashing template T murmur(const void* buffer, size_t size, uint32_t seed); //intentionally left without implementation to fail compilation for unsupported types template<> inline uint8_t murmur(const void* buffer, size_t size, uint32_t seed) { return murmur32(buffer, size, seed) & 0xff; } template<> inline uint16_t murmur(const void* buffer, size_t size, uint32_t seed) { return murmur32(buffer, size, seed) & 0xffff; } template<> inline uint32_t murmur(const void* buffer, size_t size, uint32_t seed) { return murmur32(buffer, size, seed); } template<> inline uint64_t murmur(const void* buffer, size_t size, uint32_t seed) { return murmur64(buffer, size, seed); } //c string hashing template T murmur(const char* c_str, uint32_t seed); //intentionally left without implementation to fail compilation for unsupported types template<> inline uint8_t murmur(const char* c_str, uint32_t seed) { return murmur32(c_str, seed) & 0xF; } template<> inline uint16_t murmur(const char* c_str, uint32_t seed) { return murmur32(c_str, seed) & 0xFF; } template<> inline uint32_t murmur(const char* c_str, uint32_t seed) { return murmur32(c_str, seed); } template<> inline uint64_t murmur(const char* c_str, uint32_t seed) { return murmur64(c_str, seed); } }