1 #ifndef _RAR_DATAHASH_ 2 #define _RAR_DATAHASH_ 3 4 enum HASH_TYPE {HASH_NONE,HASH_RAR14,HASH_CRC32,HASH_BLAKE2}; 5 6 struct HashValue 7 { 8 void Init(HASH_TYPE Type); 9 bool operator == (const HashValue &cmp); operator !=HashValue10 bool operator != (const HashValue &cmp) {return !(*this==cmp);} 11 12 HASH_TYPE Type; 13 union 14 { 15 uint CRC32; 16 byte Digest[SHA256_DIGEST_SIZE]; 17 }; 18 }; 19 20 21 #ifdef RAR_SMP 22 class ThreadPool; 23 class DataHash; 24 #endif 25 26 27 class DataHash 28 { 29 private: 30 HASH_TYPE HashType; 31 uint CurCRC32; 32 blake2sp_state *blake2ctx; 33 34 #ifdef RAR_SMP 35 ThreadPool *ThPool; 36 37 uint MaxThreads; 38 // Upper limit for maximum threads to prevent wasting threads in pool. 39 static const uint MaxHashThreads=8; 40 #endif 41 public: 42 DataHash(); 43 ~DataHash(); 44 void Init(HASH_TYPE Type,uint MaxThreads); 45 void Update(const void *Data,size_t DataSize); 46 void Result(HashValue *Result); 47 uint GetCRC32(); 48 bool Cmp(HashValue *CmpValue,byte *Key); Type()49 HASH_TYPE Type() {return HashType;} 50 }; 51 52 #endif 53