NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
hash.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FUNCTIONAL_HASH_HPP__
2#define NEFORCE_CORE_FUNCTIONAL_HASH_HPP__
3
13
15NEFORCE_BEGIN_NAMESPACE__
16
73
83template <typename Key, typename Dummy = void>
84struct hash;
85
90template <typename T>
91struct hash<T*> {
92 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_t operator()(const T* ptr) const noexcept {
93 return static_cast<size_t>(reinterpret_cast<uintptr_t>(ptr));
94 }
95};
96 // HashPrimary
98
99NEFORCE_BEGIN_CONSTANTS__
100
105
111NEFORCE_INLINE17 constexpr size_t FNV_OFFSET_BASIS =
112#ifdef NEFORCE_ARCH_BITS_64
113 14695981039346656037ULL;
114#else
115 2166136261U;
116#endif
117
123NEFORCE_INLINE17 constexpr size_t FNV_PRIME
124#ifdef NEFORCE_ARCH_BITS_64
125 = 1099511628211ULL;
126#else
127 = 16777619U;
128#endif
129 // HashPrimary
131
132NEFORCE_END_CONSTANTS__
133
138
152NEFORCE_CONSTEXPR14 size_t FNV_hash(const byte_t* first, const size_t count) noexcept {
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;
157 }
158 return result;
159}
160
167template <typename T>
168NEFORCE_CONSTEXPR14 size_t FNV_hash_integer(const T value) noexcept {
169 static_assert(is_integral<T>::value, "T must be integral");
170
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;
176 }
177 return result;
178}
179
187template <typename CharT>
188NEFORCE_CONSTEXPR14 size_t FNV_hash_string(const CharT* str, const size_t len) noexcept {
189 static_assert(is_character<CharT>::value, "CharT must be character types");
190
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;
195 }
196 return result;
197}
198 // HashPrimary
200
202
203template <>
204struct hash<bool> {
205 NEFORCE_NODISCARD constexpr size_t operator()(const bool x) const noexcept { return x ? 0x9e3779b9 : 0x7f4a7c15; }
206};
207
208#define __NEFORCE_BUILD_INTEGER_HASH_STRUCT(OPT) \
209 template <> \
210 struct hash<OPT> { \
211 NEFORCE_NODISCARD constexpr size_t operator()(const OPT x) const noexcept { \
212 return x == 0.0f ? 0 : FNV_hash_integer(x); \
213 } \
214 };
215
216NEFORCE_MACRO_RANGE_CHARS(__NEFORCE_BUILD_INTEGER_HASH_STRUCT)
217NEFORCE_MACRO_RANGE_INT(__NEFORCE_BUILD_INTEGER_HASH_STRUCT)
218#undef __NEFORCE_BUILD_INTEGER_HASH_STRUCT
219
220#define __NEFORCE_BUILD_FLOAT_HASH_STRUCT(OPT) \
221 template <> \
222 struct hash<OPT> { \
223 private: \
224 union __float_converter { \
225 OPT f; \
226 uint64_t i; \
227 }; \
228 \
229 public: \
230 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14 size_t operator()(const OPT x) const noexcept { \
231 if (x == 0.0f) \
232 return 0; \
233 __float_converter converter{}; \
234 converter.f = x; \
235 return FNV_hash_integer(converter.i); \
236 } \
237 };
238
239NEFORCE_MACRO_RANGE_FLOAT(__NEFORCE_BUILD_FLOAT_HASH_STRUCT)
240#undef __NEFORCE_BUILD_FLOAT_HASH_STRUCT
241
243
248
253template <typename T>
254struct hash<T, enable_if_t<is_enum_v<T>>> {
255 NEFORCE_NODISCARD NEFORCE_CONSTEXPR14 size_t operator()(const T e) const {
256 using UT = underlying_type_t<T>;
257 return hash<UT>()(static_cast<UT>(e));
258 }
259};
260
274NEFORCE_CONSTEXPR14 size_t DJB2_hash(const char* str, const size_t len) noexcept {
275 size_t hash = 5381;
276 for (size_t i = 0; i < len; ++i) {
277 hash = (hash << 5) + hash + static_cast<byte_t>(str[i]);
278 }
279 return hash;
280}
281
282
283#if defined(NEFORCE_ARCH_BITS_64) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
284
291struct murmur_hash {
292 size_t low = 0;
293 size_t high = 0;
294
295 murmur_hash() noexcept = default;
296 ~murmur_hash() noexcept = default;
297
303 murmur_hash(const size_t l, const size_t h) noexcept :
304 low(l),
305 high(h) {}
306};
307
324murmur_hash NEFORCE_API MurmurHash_x64(const void* key, size_t len, uint32_t seed) noexcept;
325#endif
326
337uint32_t NEFORCE_API MurmurHash_x32(const void* key, size_t len, uint32_t seed) noexcept;
338
339
346template <typename Key, typename Dummy = void>
348
350template <typename Key>
351struct is_nothrow_hashable<Key, void_t<decltype(_NEFORCE hash<Key>{}(_NEFORCE declval<const Key&>()))>>
352: bool_constant<noexcept(_NEFORCE hash<Key>{}(_NEFORCE declval<const Key&>()))> {};
354
355#ifdef NEFORCE_STANDARD_14
360template <typename Key>
362#endif
363
364
374template <typename Func, typename Arg, typename Dummy = void>
375struct is_hash : false_type {};
376
378template <typename Func, typename Arg>
379struct is_hash<Func, Arg,
380 enable_if_t<is_convertible<decltype(_NEFORCE declval<Func>()(_NEFORCE declval<Arg>())), size_t>::value>>
381: true_type {};
383
384#ifdef NEFORCE_STANDARD_14
389template <typename Func, typename Arg>
391#endif
392 // HashPrimary
394
395NEFORCE_END_NAMESPACE__
396#endif // NEFORCE_CORE_FUNCTIONAL_HASH_HPP__
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)
统计范围内等于指定值的元素数量
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
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哈希
uint64_t size_t
无符号大小类型
uint64_t uintptr_t
可容纳指针的无符号整数类型
#define NEFORCE_MACRO_RANGE_INT(MAC)
所有整数类型列表宏
#define NEFORCE_MACRO_RANGE_CHARS(MAC)
所有字符类型列表宏
#define NEFORCE_MACRO_RANGE_FLOAT(MAC)
浮点类型列表宏
bool_constant< true > true_type
表示true的类型
void void_t
将任意类型映射为void
bool_constant< false > false_type
表示false的类型
integral_constant< bool, Value > bool_constant
布尔常量包装器
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
哈希函数的主模板
判断类型From是否可以隐式转换为类型To
判断类型是否为有效的哈希函数
判断类型是否可无异常哈希
MurmurHash_x64的128位哈希结果容器
size_t low
哈希值的低64位
size_t high
哈希值的高64位
类型萃取