chenjunfu2-nbt-cpp v2.1.0
一个基于CPP20的NBT(Named Binary Tag)库
载入中...
搜索中...
未找到
NBT_Hash.hpp
浏览该文件的文档.
1#pragma once
2
3#include <xxhash.h>
4#include <type_traits>
5
8
12{
13public:
15 using HASH_T = XXH64_hash_t;
16 static_assert(std::is_same_v<HASH_T, uint64_t>, "Hash type does not match the required type.");
17
18private:
19 using STATE_T = XXH64_state_t;
20 STATE_T *pHashState = nullptr;
21
22 void Clear(void)
23 {
24 if (pHashState != nullptr)
25 {
26 XXH64_freeState(pHashState);
27 pHashState = nullptr;
28 }
29 }
30
31public:
34 NBT_Hash(const HASH_T &tHashSeed) :pHashState(XXH64_createState())
35 {
36 XXH64_reset(pHashState, tHashSeed);
37 }
38
41 {
42 Clear();
43 }
44
46 NBT_Hash(const NBT_Hash &_Copy) = delete;
49 NBT_Hash(NBT_Hash &&_Move) noexcept :pHashState(_Move.pHashState)
50 {
51 _Move.pHashState = nullptr;
52 }
53
55 NBT_Hash &operator=(const NBT_Hash &) = delete;
59 NBT_Hash &operator=(NBT_Hash &&_Move) noexcept
60 {
61 Clear();
62
63 pHashState = _Move.pHashState;
64 _Move.pHashState = nullptr;
65
66 return *this;
67 }
68
71 HASH_T Digest(void) const
72 {
73 return XXH64_digest(pHashState);
74 }
75
80 void Update(const void *pData, size_t szSize)
81 {
82 XXH64_update(pHashState, pData, szSize);
83 }
84
89 template<typename T>
90 requires(std::is_trivially_copyable_v<T>)
91 void Update(const T &tData)
92 {
93 Update(&tData, sizeof(tData));
94 }
95
100 template<typename T, size_t N>
101 requires(std::is_trivially_copyable_v<T>)
102 void Update(const T(&tDataArr)[N])
103 {
104 Update(&tDataArr, sizeof(tDataArr));
105 }
106
107public:
114 static HASH_T Hash(const void *pData, size_t szSize, HASH_T tHashSeed)
115 {
116 return XXH64(pData, szSize, tHashSeed);
117 }
118
125 template<typename T>
126 requires(std::is_trivially_copyable_v<T>)
127 static HASH_T Hash(const T &tData, HASH_T tHashSeed)
128 {
129 return Hash(&tData, sizeof(tData), tHashSeed);
130 }
131
138 template<typename T, size_t N>
139 requires(std::is_trivially_copyable_v<T>)
140 static HASH_T Hash(const T(&tDataArr)[N], HASH_T tHashSeed)
141 {
142 return Hash(&tDataArr, sizeof(tDataArr), tHashSeed);
143 }
144};
NBT_Hash(const NBT_Hash &_Copy)=delete
禁止拷贝构造
NBT_Hash(NBT_Hash &&_Move) noexcept
移动构造
定义 NBT_Hash.hpp:49
static HASH_T Hash(const T &tData, HASH_T tHashSeed)
直接通过可平凡复制类型获取哈希
定义 NBT_Hash.hpp:127
XXH64_hash_t HASH_T
类型别名,xxhash类型封装,类型必须是uint64_t
定义 NBT_Hash.hpp:15
HASH_T Digest(void) const
根据之前已添加的数据,获取当前的哈希值
定义 NBT_Hash.hpp:71
~NBT_Hash(void)
析构并释放xxhash对象,然后置空
定义 NBT_Hash.hpp:40
NBT_Hash & operator=(const NBT_Hash &)=delete
禁止拷贝赋值
void Update(const T(&tDataArr)[N])
通过可平凡复制类型的数组更新哈希
定义 NBT_Hash.hpp:102
void Update(const void *pData, size_t szSize)
添加指针指向的数据更新哈希
定义 NBT_Hash.hpp:80
void Update(const T &tData)
通过可平凡复制类型更新哈希
定义 NBT_Hash.hpp:91
static HASH_T Hash(const void *pData, size_t szSize, HASH_T tHashSeed)
直接通过指针指向的数据获取哈希
定义 NBT_Hash.hpp:114
NBT_Hash & operator=(NBT_Hash &&_Move) noexcept
移动赋值
定义 NBT_Hash.hpp:59
static HASH_T Hash(const T(&tDataArr)[N], HASH_T tHashSeed)
直接通过可平凡复制类型的数组获取哈希
定义 NBT_Hash.hpp:140
NBT_Hash(const HASH_T &tHashSeed)
通过哈希种子构造并初始化xxhash对象
定义 NBT_Hash.hpp:34