1#ifndef NEFORCE_CORE_FUNCTIONAL_HASH_HPP__
2#define NEFORCE_CORE_FUNCTIONAL_HASH_HPP__
15NEFORCE_BEGIN_NAMESPACE__
83template <
typename Key,
typename Dummy =
void>
92 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
size_t operator()(
const T* ptr)
const noexcept {
93 return static_cast<size_t>(
reinterpret_cast<uintptr_t>(ptr));
99NEFORCE_BEGIN_CONSTANTS__
112#ifdef NEFORCE_ARCH_BITS_64
113 14695981039346656037ULL;
124#ifdef NEFORCE_ARCH_BITS_64
132NEFORCE_END_CONSTANTS__
153 size_t result = constants::FNV_OFFSET_BASIS;
154 for (
size_t i = 0; i <
count; i++) {
155 result ^=
static_cast<size_t>(first[i]);
156 result *= constants::FNV_PRIME;
171 size_t result = constants::FNV_OFFSET_BASIS;
172 for (
size_t i = 0; i <
sizeof(T); ++i) {
173 const byte_t byte_val =
static_cast<byte_t>((value >> (i * 8)) & 0xFF);
174 result ^=
static_cast<size_t>(byte_val);
175 result *= constants::FNV_PRIME;
187template <
typename CharT>
188NEFORCE_CONSTEXPR14
size_t FNV_hash_string(
const CharT* str,
const size_t len)
noexcept {
191 size_t result = constants::FNV_OFFSET_BASIS;
192 for (
size_t i = 0; i < len; ++i) {
193 result ^=
static_cast<size_t>(
static_cast<byte_t>(str[i]));
194 result *= constants::FNV_PRIME;
205 NEFORCE_NODISCARD
constexpr size_t operator()(
const bool x)
const noexcept {
return x ? 0x9e3779b9 : 0x7f4a7c15; }
208#define __NEFORCE_BUILD_INTEGER_HASH_STRUCT(OPT) \
211 NEFORCE_NODISCARD constexpr size_t operator()(const OPT x) const noexcept { \
212 return x == 0.0f ? 0 : FNV_hash_integer(x); \
218#undef __NEFORCE_BUILD_INTEGER_HASH_STRUCT
220#define __NEFORCE_BUILD_FLOAT_HASH_STRUCT(OPT) \
224 union __float_converter { \
230 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14 size_t operator()(const OPT x) const noexcept { \
233 __float_converter converter{}; \
235 return FNV_hash_integer(converter.i); \
240#undef __NEFORCE_BUILD_FLOAT_HASH_STRUCT
255 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14
size_t operator()(
const T e)
const {
257 return hash<UT>()(
static_cast<UT
>(e));
274NEFORCE_CONSTEXPR14
size_t DJB2_hash(
const char* str,
const size_t len)
noexcept {
276 for (
size_t i = 0; i < len; ++i) {
277 hash = (hash << 5) + hash + static_cast<byte_t>(str[i]);
283#if defined(NEFORCE_ARCH_BITS_64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
295 murmur_hash() noexcept = default;
296 ~murmur_hash() noexcept = default;
303 murmur_hash(const
size_t l, const
size_t h) noexcept :
346template <
typename Key,
typename Dummy =
void>
350template <
typename Key>
355#ifdef NEFORCE_STANDARD_14
360template <
typename Key>
374template <
typename Func,
typename Arg,
typename Dummy =
void>
378template <
typename Func,
typename Arg>
384#ifdef NEFORCE_STANDARD_14
389template <
typename Func,
typename Arg>
395NEFORCE_END_NAMESPACE__
typename underlying_type< T >::type underlying_type_t
underlying_type的便捷别名
NEFORCE_INLINE17 constexpr bool is_enum_v
is_enum的便捷变量模板
unsigned char byte_t
字节类型,定义为无符号字符
unsigned int uint32_t
32位无符号整数类型
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
constexpr bool is_hash_v
is_hash的便捷变量模板
uint32_t NEFORCE_API MurmurHash_x32(const void *key, size_t len, uint32_t seed) noexcept
MurmurHash3_x86_32算法
NEFORCE_CONSTEXPR14 size_t FNV_hash(const byte_t *first, const size_t count) noexcept
FNV-1a哈希算法
NEFORCE_INLINE17 constexpr bool is_nothrow_hashable_v
is_nothrow_hashable的便捷变量模板
NEFORCE_INLINE17 constexpr size_t FNV_OFFSET_BASIS
FNV哈希算法的偏移基础值
NEFORCE_CONSTEXPR14 size_t FNV_hash_integer(const T value) noexcept
整数类型的FNV哈希
NEFORCE_CONSTEXPR14 size_t DJB2_hash(const char *str, const size_t len) noexcept
DJB2哈希算法
murmur_hash NEFORCE_API MurmurHash_x64(const void *key, size_t len, uint32_t seed) noexcept
MurmurHash3_x64_128算法
NEFORCE_INLINE17 constexpr size_t FNV_PRIME
FNV哈希算法的质数乘数
NEFORCE_CONSTEXPR14 size_t FNV_hash_string(const CharT *str, const size_t len) noexcept
字符串类型的FNV哈希
#define NEFORCE_MACRO_RANGE_INT(MAC)
所有整数类型列表宏
#define NEFORCE_MACRO_RANGE_CHARS(MAC)
所有字符类型列表宏
#define NEFORCE_MACRO_RANGE_FLOAT(MAC)
浮点类型列表宏
bool_constant< true > true_type
表示true的类型
bool_constant< false > false_type
表示false的类型
integral_constant< bool, Value > bool_constant
布尔常量包装器
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
static constexpr bool value
MurmurHash_x64的128位哈希结果容器