1#ifndef MSTL_CORE_FUNCTIONAL_HASH_HPP__
2#define MSTL_CORE_FUNCTIONAL_HASH_HPP__
30template <
typename Key,
typename Dummy =
void>
44 MSTL_NODISCARD MSTL_CONSTEXPR20
size_t operator ()(
const T* ptr)
const noexcept {
45 return static_cast<size_t>(
reinterpret_cast<uintptr_t>(ptr));
65MSTL_INLINE17
constexpr size_t FNV_OFFSET_BASIS =
66#ifdef MSTL_DATA_BUS_WIDTH_64__
67 14695981039346656037ULL;
77MSTL_INLINE17
constexpr size_t FNV_PRIME
78#ifdef MSTL_DATA_BUS_WIDTH_64__
102 for (
size_t i = 0; i <
count; i++) {
103 result ^=
static_cast<size_t>(first[i]);
120MSTL_CONSTEXPR14
size_t FNV_hash_integer(
const T& value)
noexcept {
124 for (
size_t i = 0; i <
sizeof(T); ++i) {
125 const byte_t byte_val =
static_cast<byte_t>((value >> (i * 8)) & 0xFF);
126 result ^=
static_cast<size_t>(byte_val);
139template <
typename CharT>
140MSTL_CONSTEXPR14
size_t FNV_hash_string(
const CharT* str,
const size_t len)
noexcept {
144 for (
size_t i = 0; i < len; ++i) {
145 result ^=
static_cast<size_t>(
static_cast<byte_t>(str[i]));
160 MSTL_NODISCARD
constexpr size_t operator ()(
const bool x)
const noexcept {
161 return x ? 0x9e3779b9 : 0x7f4a7c15;
165#define __MSTL_BUILD_INTEGER_HASH_STRUCT(OPT) \
166template <> struct hash<OPT> { \
167 MSTL_NODISCARD constexpr size_t operator ()(const OPT& x) const noexcept { \
168 return x == 0.0f ? 0 : _INNER FNV_hash_integer(x); \
172MSTL_MACRO_RANGE_CHARS(__MSTL_BUILD_INTEGER_HASH_STRUCT)
173MSTL_MACRO_RANGE_INT(__MSTL_BUILD_INTEGER_HASH_STRUCT)
174#undef FLOAT_HASH_STRUCT__
178union __float_converter { T f;
uint64_t i; };
181#define __MSTL_BUILD_FLOAT_HASH_STRUCT(OPT) \
184 MSTL_NODISCARD MSTL_CONSTEXPR14 size_t operator ()(const OPT x) const noexcept { \
185 if (x == 0.0f) return 0; \
186 _INNER __float_converter<OPT> converter{}; \
188 return _INNER FNV_hash_integer(converter.i); \
192MSTL_MACRO_RANGE_FLOAT(__MSTL_BUILD_FLOAT_HASH_STRUCT)
193#undef __MSTL_BUILD_FLOAT_HASH_STRUCT
216MSTL_CONSTEXPR14
size_t DJB2_hash(
const char* str,
const size_t len)
noexcept {
218 for (
size_t i = 0; i < len; ++i) {
219 hash = (hash << 5) + hash + static_cast<byte_t>(str[i]);
232#ifdef MSTL_DATA_BUS_WIDTH_64__
244 murmur_hash() noexcept = default;
245 ~murmur_hash() noexcept = default;
252 murmur_hash(const
size_t l, const
size_t h) noexcept
272murmur_hash MurmurHash_x64(
const void* key,
size_t len,
uint32_t seed)
noexcept;
301template <
typename Key,
typename Dummy =
void>
305template <
typename Key>
310#ifdef MSTL_STANDARD_14__
315template <
typename Key>
329template <
typename Func,
typename Arg,
typename Dummy =
void>
333template <
typename Func,
typename Arg>
339#ifdef MSTL_STANDARD_14__
344template <
typename Func,
typename Arg>
unsigned char byte_t
字节类型,定义为无符号字符
unsigned int uint32_t
32位无符号整数类型
unsigned long long uint64_t
64位无符号整数类型
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
MSTL_CONSTEXPR14 size_t DJB2_hash(const char *str, const size_t len) noexcept
DJB2哈希算法
MSTL_CONSTEXPR14 size_t FNV_hash(const byte_t *first, const size_t count) noexcept
FNV-1a哈希算法
uint32_t MurmurHash_x32(const void *key, size_t len, uint32_t seed) noexcept
MurmurHash3_x86_32算法
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_CONSTANTS__
结束constants命名空间
#define MSTL_END_INNER__
结束inner命名空间
#define _CONSTANTS
constants命名空间前缀
#define MSTL_BEGIN_CONSTANTS__
开始constants命名空间
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
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