Files
TL/include/tl/murmur_hash.h
jeanlemotan 8297b0b45f First
2024-07-02 18:06:33 +02:00

44 lines
2.3 KiB
C++

#pragma once
#include "tl/detail/prologue.h"
#include <cstdint>
#include <cstddef>
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<typename T> 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<typename T> 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); }
}