2021-06-08 20:11:25 +08:00
|
|
|
|
#ifndef HGL_UTIL_HASH_INCLUDE
|
|
|
|
|
#define HGL_UTIL_HASH_INCLUDE
|
|
|
|
|
|
|
|
|
|
#include<hgl/type/String.h>
|
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
|
|
|
|
namespace util
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Hash算法枚举
|
|
|
|
|
*/
|
|
|
|
|
enum class HASH ///Hash算法枚举
|
|
|
|
|
{
|
|
|
|
|
Adler32, ///<一种较CRC32更为安全的快速HASH算法
|
|
|
|
|
CRC32, ///<最快速的HASH算法,但最不安全,仅用于低安全性的简单验证
|
|
|
|
|
MD4, ///<较MD5在安全性下稍弱。但仍未被攻破,且较MD5更快
|
|
|
|
|
MD5, ///<最常用的HASH算法
|
|
|
|
|
|
|
|
|
|
SHA1, ///<较MD5更为安全,但计算较慢
|
|
|
|
|
SHA1LE, ///<SHA1改版
|
|
|
|
|
SHA256,
|
|
|
|
|
SHA512,
|
|
|
|
|
|
2024-07-25 02:02:24 +08:00
|
|
|
|
xxH32,
|
|
|
|
|
xxH64,
|
2024-11-26 00:39:53 +08:00
|
|
|
|
xxH3_64,
|
|
|
|
|
xxH3_128,
|
2024-07-25 02:02:24 +08:00
|
|
|
|
|
2024-11-25 23:33:41 +08:00
|
|
|
|
FNV1a,
|
2024-11-26 00:39:53 +08:00
|
|
|
|
Murmur3,
|
|
|
|
|
City32,
|
|
|
|
|
City64,
|
|
|
|
|
City128,
|
2024-07-25 02:02:24 +08:00
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
ENUM_CLASS_RANGE(Adler32,City128)
|
2021-06-08 20:11:25 +08:00
|
|
|
|
};//enum HASH
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Hash编码结构模板
|
|
|
|
|
*/
|
2024-12-05 13:39:17 +08:00
|
|
|
|
template<size_t SIZE> struct HashCode:public ComparatorData<HashCode<SIZE>>
|
2021-06-08 20:11:25 +08:00
|
|
|
|
{
|
2024-11-26 00:39:53 +08:00
|
|
|
|
uint8 code[SIZE]{};
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
using CharArray=T[(SIZE<<1)+1];
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
static constexpr int size()noexcept{return SIZE;}
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
const uint8 operator[](int index)const{return code[index];}
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
void CopyFrom (const void *ptr){memcpy(code,ptr,SIZE);}
|
|
|
|
|
void FromString (const char *str){ParseHexStr(code,str,SIZE);}
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
template<typename T> void ToUpperString(T *str,const T gap_char=0) const {ToUpperHexStr<T>(str,code,SIZE,gap_char);}
|
|
|
|
|
template<typename T> void ToLowerString(T *str,const T gap_char=0) const {ToLowerHexStr<T>(str,code,SIZE,gap_char);}
|
|
|
|
|
};//template<size_t SIZE> struct HashCode
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 散列值计算功能基类
|
|
|
|
|
*/
|
|
|
|
|
class Hash ///散列值计算功能基类
|
|
|
|
|
{
|
2024-11-26 00:39:53 +08:00
|
|
|
|
AnsiString hash_name;
|
|
|
|
|
size_t hash_size;
|
|
|
|
|
|
2021-06-08 20:11:25 +08:00
|
|
|
|
public:
|
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
Hash(const size_t s,const AnsiString &n):hash_size(s),hash_name(n){}
|
2021-06-08 20:11:25 +08:00
|
|
|
|
virtual ~Hash()=default;
|
2024-11-26 00:39:53 +08:00
|
|
|
|
|
|
|
|
|
void GetName (AnsiString &name)const {name=hash_name;} ///<取得HASH算法的名称
|
|
|
|
|
const size_t GetHashBytes()const noexcept {return hash_size;} ///<取得HASH码字节长度(MD4/MD5为16,SHA1为20)
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
|
|
|
|
virtual void Init()=0; ///<初始化散列值计算
|
|
|
|
|
virtual void Update(const void *,uint)=0; ///<提交新的数据
|
|
|
|
|
virtual void Final(void *)=0; ///<结束并取得结果
|
2021-09-22 15:23:50 +08:00
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
void Write(const T &data)
|
|
|
|
|
{
|
|
|
|
|
Update(&data,sizeof(T));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
void Write(const T *ptr,const uint count)
|
|
|
|
|
{
|
|
|
|
|
Update(ptr,sizeof(T)*count);
|
|
|
|
|
}
|
2021-06-08 20:11:25 +08:00
|
|
|
|
};//class Hash
|
|
|
|
|
|
|
|
|
|
template<HASH ha> Hash *CreateHash(); ///<创建一个hash值计算类实例
|
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
Hash *CreateHash(const HASH ha); ///<创建一个hash值计算类实例
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 计算一段数据的Hash值
|
|
|
|
|
* @param data 数据指针
|
|
|
|
|
* @param size 数据长度
|
|
|
|
|
* @param ha hash算法
|
|
|
|
|
* @param hash_code 计算后的hash值存放处
|
|
|
|
|
* @return 是否计算成功
|
|
|
|
|
*/
|
|
|
|
|
template<HASH ha> bool CountHash(const void *data,int size,void *hash_code)
|
|
|
|
|
{
|
|
|
|
|
if(!data||size<=0||!hash_code)return(false);
|
|
|
|
|
|
|
|
|
|
Hash *h=CreateHash<ha>();
|
|
|
|
|
|
|
|
|
|
if(!h)return(false);
|
|
|
|
|
|
|
|
|
|
h->Init();
|
|
|
|
|
h->Update(data,size);
|
|
|
|
|
h->Final(hash_code);
|
|
|
|
|
|
|
|
|
|
delete h;
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2024-11-26 00:39:53 +08:00
|
|
|
|
* 取得一个文件的hash值
|
|
|
|
|
* @param filename 文件名
|
|
|
|
|
* @param ha hash对象
|
|
|
|
|
* @param hash_code 计算后的hash存放处
|
2021-06-08 20:11:25 +08:00
|
|
|
|
* @return 是否计算成功
|
|
|
|
|
*/
|
2024-11-26 00:39:53 +08:00
|
|
|
|
bool GetFileHash(const OSString &filename,Hash *ha,void *hash_code);
|
2021-06-08 20:11:25 +08:00
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
template<typename ha> bool GetFileHash(const OSString &filename,void *hash_code,size_t &hash_size)
|
2021-06-08 20:11:25 +08:00
|
|
|
|
{
|
|
|
|
|
Hash *h=CreateHash<ha>();
|
|
|
|
|
if(!h)return(false);
|
|
|
|
|
|
2024-11-26 00:39:53 +08:00
|
|
|
|
if(!GetFileHash(filename,h,hash_code))
|
|
|
|
|
{
|
|
|
|
|
delete h;
|
|
|
|
|
return(false);
|
|
|
|
|
}
|
|
|
|
|
hash_size=h->GetHashBytes();
|
2021-06-08 20:11:25 +08:00
|
|
|
|
delete h;
|
|
|
|
|
return(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 取得一个文件的hash值
|
|
|
|
|
* @param filename 文件名
|
|
|
|
|
* @param ha hash算法
|
|
|
|
|
* @param hash_str 计算后的hash值存放处
|
|
|
|
|
* @param litter 小写字母
|
|
|
|
|
* @return 是否计算成功
|
|
|
|
|
*/
|
2024-12-24 22:41:09 +08:00
|
|
|
|
//bool GetFileHash(const OSString &filename,HASH ha,U8String &hash_str,bool litter=true);
|
2021-06-08 20:11:25 +08:00
|
|
|
|
}//namespace util
|
|
|
|
|
}//namespace hgl
|
|
|
|
|
#endif//HGL_UTIL_HASH_INCLUDE
|