1#ifndef NEFORCE_CORE_FUNCTIONAL_HASH_HPP__
2#define NEFORCE_CORE_FUNCTIONAL_HASH_HPP__
16NEFORCE_BEGIN_NAMESPACE__
94template <
typename Key,
typename Dummy =
void>
103 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
size_t operator()(
const T* ptr)
const noexcept {
104 return static_cast<size_t>(
reinterpret_cast<uintptr_t>(ptr));
110NEFORCE_BEGIN_CONSTANTS__
123#ifdef NEFORCE_ARCH_BITS_64
124 14695981039346656037ULL;
135#ifdef NEFORCE_ARCH_BITS_64
143NEFORCE_END_CONSTANTS__
165 for (
size_t i = 0; i <
count; i++) {
166 result ^=
static_cast<size_t>(first[i]);
183 for (
size_t i = 0; i <
sizeof(T); ++i) {
184 const auto byte_val =
static_cast<byte_t>((value >> (i * 8)) & 0xFF);
185 result ^=
static_cast<size_t>(byte_val);
198template <
typename CharT>
199NEFORCE_CONSTEXPR14
size_t FNV_hash_string(
const CharT* str,
const size_t len)
noexcept {
203 for (
size_t i = 0; i < len; ++i) {
204 result ^=
static_cast<size_t>(
static_cast<byte_t>(str[i]));
220#ifdef NEFORCE_ARCH_BITS_64
221 x += 0x9e3779b97f4a7c15ULL;
223 x *= 0xff51afd7ed558ccdULL;
225 x *= 0xc4ceb9fe1a85ec53ULL;
245 NEFORCE_NODISCARD
constexpr size_t operator()(
const bool x)
const noexcept {
return x ? 0x9e3779b9 : 0x7f4a7c15; }
248#define __NEFORCE_BUILD_INTEGER_HASH_STRUCT(OPT) \
251 NEFORCE_NODISCARD constexpr size_t operator()(const OPT x) const noexcept { \
252 return low_level_hash(static_cast<size_t>(x)); \
258#undef __NEFORCE_BUILD_INTEGER_HASH_STRUCT
260#define __NEFORCE_BUILD_FLOAT_HASH_STRUCT(OPT) \
264 union __float_converter { \
270 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14 size_t operator()(const OPT x) const noexcept { \
273 __float_converter converter{}; \
275 return low_level_hash(static_cast<size_t>(converter.i)); \
280#undef __NEFORCE_BUILD_FLOAT_HASH_STRUCT
295NEFORCE_CONSTEXPR14
void hash_combine(
size_t& seed,
const T& value)
noexcept {
296 seed ^=
hash<T>()(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
307template <
typename... Types>
310 int dummy[] = {(_NEFORCE
hash_combine(seed, values), 0)...};
326 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14
size_t operator()(
const T e)
const {
328 return hash<UT>()(
static_cast<UT
>(e));
345NEFORCE_CONSTEXPR14
size_t DJB2_hash(
const char* str,
const size_t len)
noexcept {
347 for (
size_t i = 0; i < len; ++i) {
348 hash = (hash << 5) + hash + static_cast<byte_t>(str[i]);
354#ifdef NEFORCE_ARCH_BITS_64
366 murmur_hash() noexcept = default;
367 ~murmur_hash() noexcept = default;
374 murmur_hash(const
size_t l, const
size_t h) noexcept :
411#ifdef NEFORCE_COMPILER_MSVC
413# pragma warning(push)
414# pragma warning(disable : 26819)
429 constexpr uint32_t PRIME32_1 = 0x9E3779B1U;
430 constexpr uint32_t PRIME32_2 = 0x85EBCA77U;
431 constexpr uint32_t PRIME32_3 = 0xC2B2AE3DU;
432 constexpr uint32_t PRIME32_4 = 0x27D4EB2FU;
433 constexpr uint32_t PRIME32_5 = 0x165667B1U;
435 const auto* p =
static_cast<const byte_t*
>(input);
439 uint32_t acc1 = seed + PRIME32_1 + PRIME32_2;
444 const byte_t* limit = p + (len & ~static_cast<size_t>(15));
445 for (; p < limit; p += 16) {
454 hash = seed + PRIME32_5;
460 for (; p + 4 <=
end; p += 4) {
487#ifdef NEFORCE_ARCH_BITS_64
500 constexpr uint64_t PRIME64_1 = 0x9E3779B185EBCA87ULL;
501 constexpr uint64_t PRIME64_2 = 0xC2B2AE3D27D4EB4FULL;
502 constexpr uint64_t PRIME64_3 = 0x165667B19E3779F9ULL;
503 constexpr uint64_t PRIME64_4 = 0x85EBCA77C2B2AE63ULL;
504 constexpr uint64_t PRIME64_5 = 0x27D4EB2F165667C5ULL;
506 const auto* p =
static_cast<const byte_t*
>(input);
510 uint64_t acc1 = seed + PRIME64_1 + PRIME64_2;
515 const byte_t* limit = p + (len & ~static_cast<size_t>(31));
516 for (; p < limit; p += 32) {
526 hash =
hash * PRIME64_1 + PRIME64_4;
528 hash =
hash * PRIME64_1 + PRIME64_4;
530 hash =
hash * PRIME64_1 + PRIME64_4;
532 hash =
hash * PRIME64_1 + PRIME64_4;
534 hash = seed + PRIME64_5;
540 for (; p + 8 <=
end; p += 8) {
548 for (; p + 4 <=
end; p += 4) {
576# ifdef NEFORCE_COMPILER_MSVC
605size_t NEFORCE_API
city_hash64(
const void* key,
size_t len)
noexcept;
626template <
typename Key,
typename Dummy =
void>
630template <
typename Key>
632: bool_constant<noexcept(_NEFORCE hash<Key>{}(_NEFORCE declval<const Key&>()))> {};
635#ifdef NEFORCE_STANDARD_14
640template <
typename Key>
654template <
typename Func,
typename Arg,
typename Dummy =
void>
658template <
typename Func,
typename Arg>
664#ifdef NEFORCE_STANDARD_14
669template <
typename Func,
typename Arg>
675NEFORCE_END_NAMESPACE__
constexpr bool is_enum_v
is_enum的便捷变量模板
typename underlying_type< T >::type underlying_type_t
underlying_type的便捷别名
constexpr uint32_t rotate_l32(const uint32_t x, const int s) noexcept
32位整数循环左移
constexpr uint64_t rotate_l64(const uint64_t x, const int s) noexcept
64位整数循环左移
unsigned char byte_t
字节类型,定义为无符号字符
unsigned int uint32_t
32位无符号整数类型
unsigned long uint64_t
64位无符号整数类型
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
constexpr size_t FNV_hash_string(const CharT *str, const size_t len) noexcept
字符串类型的FNV哈希
constexpr size_t FNV_OFFSET_BASIS
FNV哈希算法的偏移基础值
size_t city_hash64(const void *key, size_t len) noexcept
CityHash64 哈希算法
constexpr size_t FNV_hash(const byte_t *first, const size_t count) noexcept
FNV-1a哈希算法
uint32_t murmur_hash32(const void *key, size_t len, uint32_t seed) noexcept
MurmurHash3_x86_32算法
murmur_hash murmur_hash64(const void *key, size_t len, uint32_t seed) noexcept
MurmurHash3_x64_128算法
constexpr uint32_t XXH32(const void *input, size_t len, uint32_t seed=0) noexcept
XXH32 哈希算法
constexpr size_t FNV_hash_integer(const T value) noexcept
整数类型的FNV哈希
constexpr uint64_t XXH64(const void *input, size_t len, uint64_t seed=0) noexcept
XXH64 哈希算法
constexpr bool is_nothrow_hashable_v
is_nothrow_hashable的便捷变量模板
uint64_t wyhash(const void *key, size_t len, uint64_t seed) noexcept
wyhash 哈希算法
constexpr bool is_hash_v
is_hash的便捷变量模板
uint64_t XXH3_64(const void *data, size_t len) noexcept
XXH3_64bits 哈希算法
constexpr size_t DJB2_hash(const char *str, const size_t len) noexcept
DJB2哈希算法
constexpr size_t low_level_hash(size_t x) noexcept
快速位混合哈希函数
constexpr size_t FNV_PRIME
FNV哈希算法的质数乘数
constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
#define NEFORCE_MACRO_RANGE_INT(MAC)
所有整数类型列表宏
#define NEFORCE_MACRO_RANGE_CHARS(MAC)
所有字符类型列表宏
#define NEFORCE_MACRO_RANGE_FLOAT(MAC)
浮点类型列表宏
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
bool_constant< false > false_type
表示false的类型
bool_constant< true > true_type
表示true的类型
constexpr void hash_combine(size_t &seed, const T &value) noexcept
混合两个哈希值
constexpr size_t hash_combine_all(const Types &... values) noexcept
混合多个哈希值
static constexpr uint32_t read_le32(const byte_t *data) noexcept
读取32位小端整数
static constexpr uint64_t read_le64(const byte_t *data) noexcept
读取64位小端整数
static constexpr bool value
MurmurHash_x64的128位哈希结果容器