2020-09-08 08:34:21 +00:00
|
|
|
#ifndef _RAR_DATAHASH_
|
|
|
|
#define _RAR_DATAHASH_
|
|
|
|
|
|
|
|
enum HASH_TYPE {HASH_NONE,HASH_RAR14,HASH_CRC32,HASH_BLAKE2};
|
|
|
|
|
|
|
|
struct HashValue
|
|
|
|
{
|
|
|
|
void Init(HASH_TYPE Type);
|
2023-05-19 19:24:23 +00:00
|
|
|
|
|
|
|
// Use the const member, so types on both sides of "==" match.
|
|
|
|
// Otherwise clang -std=c++20 issues "ambiguity is between a regular call
|
|
|
|
// to this operator and a call with the argument order reversed" warning.
|
|
|
|
bool operator == (const HashValue &cmp) const;
|
|
|
|
|
|
|
|
// Not actually used now. Const member for same reason as operator == above.
|
|
|
|
bool operator != (const HashValue &cmp) const {return !(*this==cmp);}
|
2020-09-08 08:34:21 +00:00
|
|
|
|
|
|
|
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
|