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