| #ifndef _RAR_DATAHASH_ |
| #define _RAR_DATAHASH_ |
| |
| enum HASH_TYPE {HASH_NONE,HASH_RAR14,HASH_CRC32,HASH_BLAKE2}; |
| |
| struct HashValue |
| { |
| void Init(HASH_TYPE Type); |
| bool operator == (const HashValue &cmp); |
| bool operator != (const HashValue &cmp) {return !(*this==cmp);} |
| |
| HASH_TYPE Type; |
| union |
| { |
| uint CRC32; |
| byte Digest[SHA256_DIGEST_SIZE]; |
| }; |
| }; |
| |
| |
| #ifdef RAR_SMP |
| class ThreadPool; |
| class DataHash; |
| #endif |
| |
| |
| class DataHash |
| { |
| private: |
| HASH_TYPE HashType; |
| uint CurCRC32; |
| blake2sp_state *blake2ctx; |
| |
| #ifdef RAR_SMP |
| ThreadPool *ThPool; |
| |
| uint MaxThreads; |
| // Upper limit for maximum threads to prevent wasting threads in pool. |
| static const uint MaxHashThreads=8; |
| #endif |
| public: |
| DataHash(); |
| ~DataHash(); |
| void Init(HASH_TYPE Type,uint MaxThreads); |
| void Update(const void *Data,size_t DataSize); |
| void Result(HashValue *Result); |
| uint GetCRC32(); |
| bool Cmp(HashValue *CmpValue,byte *Key); |
| HASH_TYPE Type() {return HashType;} |
| }; |
| |
| #endif |