179 lines
5.3 KiB
C
Raw Normal View History

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-11-26 00:39:53 +08:00
template<size_t SIZE> struct HashCode
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);}
2021-06-08 20:11:25 +08:00
const int CompFunc(const HashCode<SIZE> &hash)const
{
const unsigned char *s=code;
const unsigned char *t=hash.code;
for(int i=0;i<SIZE;i++)
{
if(*s!=*t)
return(*s-*t);
s++;
t++;
}
return(0);
}
CompOperator(const HashCode<SIZE> &,CompFunc)
2024-11-26 00:39:53 +08:00
};//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-11-26 00:39:53 +08:00
//bool GetFileHash(const OSString &filename,HASH ha,UTF8String &hash_str,bool litter=true);
2021-06-08 20:11:25 +08:00
}//namespace util
}//namespace hgl
#endif//HGL_UTIL_HASH_INCLUDE