Added FNV1a hash

This commit is contained in:
hyzboy 2024-11-25 23:33:41 +08:00
parent a1cd09b5d4
commit 79bb27d9cb
3 changed files with 49 additions and 8 deletions

View File

@ -26,8 +26,12 @@ namespace hgl
XXH3_64, XXH3_64,
XXH3_128, XXH3_128,
FNV1a,
// Murmur3,
// City64,
// City128,
ENUM_CLASS_RANGE(Adler32,XXH3_128) ENUM_CLASS_RANGE(Adler32,FNV1a)
};//enum HASH };//enum HASH
/** /**
@ -110,8 +114,9 @@ namespace hgl
using HashCodexxH64 =HashCode<8> ; using HashCodexxH64 =HashCode<8> ;
using HashCodeXXH3_64 =HashCode<8> ; using HashCodeXXH3_64 =HashCode<8> ;
using HashCodeXXH3_128 =HashCode<16> ; using HashCodeXXH3_128 =HashCode<16> ;
using HashCodeFNV1a =HashCode<4>;
const int hash_code_bytes[]={4,4,16,16,20,20,32,64,4,8,16}; //hash码长度 const int hash_code_bytes[]={4,4,16,16,20,20,32,64,4,8,16,4}; //hash码长度
/** /**
* *
@ -160,8 +165,9 @@ namespace hgl
HGL_CREATE_HASH_FUNC(xxH64) HGL_CREATE_HASH_FUNC(xxH64)
HGL_CREATE_HASH_FUNC(XXH3_64) HGL_CREATE_HASH_FUNC(XXH3_64)
HGL_CREATE_HASH_FUNC(XXH3_128) HGL_CREATE_HASH_FUNC(XXH3_128)
HGL_CREATE_HASH_FUNC(FNV1a)
#undef HGL_CREATE_HASH_FUNC //#undef HGL_CREATE_HASH_FUNC
inline Hash *CreateHash(HASH ha) inline Hash *CreateHash(HASH ha)
{ {
@ -183,6 +189,7 @@ namespace hgl
CreatexxH64Hash, CreatexxH64Hash,
CreateXXH3_64Hash, CreateXXH3_64Hash,
CreateXXH3_128Hash, CreateXXH3_128Hash,
CreateFNV1aHash
}; };
return func[(size_t)ha](); return func[(size_t)ha]();
@ -240,7 +247,8 @@ namespace hgl
CountHash<HASH::xxH32 >, CountHash<HASH::xxH32 >,
CountHash<HASH::xxH64 >, CountHash<HASH::xxH64 >,
CountHash<HASH::XXH3_64 >, CountHash<HASH::XXH3_64 >,
CountHash<HASH::XXH3_128> CountHash<HASH::XXH3_128>,
CountHash<HASH::FNV1a >
}; };
return func[(size_t)ha](data,size,hash_code); return func[(size_t)ha](data,size,hash_code);
@ -311,7 +319,8 @@ namespace hgl
CountHashStr<HASH::xxH32 >, CountHashStr<HASH::xxH32 >,
CountHashStr<HASH::xxH64 >, CountHashStr<HASH::xxH64 >,
CountHashStr<HASH::XXH3_64 >, CountHashStr<HASH::XXH3_64 >,
CountHashStr<HASH::XXH3_128 > CountHashStr<HASH::XXH3_128 >,
CountHashStr<HASH::FNV1a >
}; };
return func[(size_t)ha](data,size,hash_str,litter); return func[(size_t)ha](data,size,hash_str,litter);
@ -333,6 +342,7 @@ namespace hgl
HGL_COUNT_HASH_FUNC(xxH64) HGL_COUNT_HASH_FUNC(xxH64)
HGL_COUNT_HASH_FUNC(XXH3_64) HGL_COUNT_HASH_FUNC(XXH3_64)
HGL_COUNT_HASH_FUNC(XXH3_128) HGL_COUNT_HASH_FUNC(XXH3_128)
HGL_COUNT_HASH_FUNC(FNV1a)
#undef HGL_COUNT_HASH_FUNC #undef HGL_COUNT_HASH_FUNC

View File

@ -69,7 +69,11 @@ IF(CM_UTIL_SUPPORT_HASH)
hash/sha1le.cpp hash/sha1le.cpp
hash/sha256.cpp hash/sha256.cpp
hash/sha512.cpp hash/sha512.cpp
hash/xxHash3.cpp) hash/xxHash3.cpp
hash/FNV1a.cpp
hash/MurmurHash3.cpp
hash/GoogleCityHash.cpp
)
SOURCE_GROUP("HASH" FILES ${HASH_HEADER_FILES} ${HASH_SOURCE_FILES}) SOURCE_GROUP("HASH" FILES ${HASH_HEADER_FILES} ${HASH_SOURCE_FILES})
ENDIF(CM_UTIL_SUPPORT_HASH) ENDIF(CM_UTIL_SUPPORT_HASH)

View File

@ -6,14 +6,13 @@ namespace hgl
{ {
namespace namespace
{ {
uint32_t FNV1aHash(const void *key, int len) uint32_t CountFNV1a(uint32_t hash,const void *key, int len)
{ {
//本代码来自Github Copilot //本代码来自Github Copilot
//FNV-1a 是一种简单且高效的哈希算法,适用于大多数场景。它具有良好的分布性和较快的计算速度。 //FNV-1a 是一种简单且高效的哈希算法,适用于大多数场景。它具有良好的分布性和较快的计算速度。
const uint8_t *data = (const uint8_t *)key; const uint8_t *data = (const uint8_t *)key;
uint32_t hash = 2166136261u;
for (int i = 0; i < len; ++i) { for (int i = 0; i < len; ++i) {
hash ^= data[i]; hash ^= data[i];
@ -23,5 +22,33 @@ namespace hgl
return hash; return hash;
} }
}//namespace }//namespace
class FNV1a:public Hash
{
uint32_t result;
public:
void GetName(UTF8String &str)const override{str=U8_TEXT("FNV1a");}
void GetName(UTF16String &str)const override{str=U16_TEXT("FNV1a");}
const int GetHashBytes()const override{return 4;}
void Init()override
{
result=2166136261u;
}
void Update(const void *input,uint inputLen)override
{
result=CountFNV1a(result,input,inputLen);
}
void Final(void *digest)override
{
*(uint32_t *)digest=result;
}
};//class FNV1a
Hash *CreateFNV1aHash()
{
return(new FNV1a);
}
}//namespace util }//namespace util
}//namespace hgl }//namespace hgl