1*f6dc9357SAndroid Build Coastguard Worker // Xxh64Reg.cpp 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h" 4*f6dc9357SAndroid Build Coastguard Worker 5*f6dc9357SAndroid Build Coastguard Worker #include "../../C/Xxh64.h" 6*f6dc9357SAndroid Build Coastguard Worker #include "../../C/CpuArch.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker // #define Z7_USE_HHX64_ORIGINAL 9*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_HHX64_ORIGINAL 10*f6dc9357SAndroid Build Coastguard Worker #ifdef __clang__ 11*f6dc9357SAndroid Build Coastguard Worker #include "../../C/zstd7z/7z_zstd_cmpl.h" 12*f6dc9357SAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wlanguage-extension-token" 13*f6dc9357SAndroid Build Coastguard Worker #endif 14*f6dc9357SAndroid Build Coastguard Worker #define XXH_STATIC_LINKING_ONLY 15*f6dc9357SAndroid Build Coastguard Worker #include "../../C/zstd7z/common/xxhash.h" 16*f6dc9357SAndroid Build Coastguard Worker #endif 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyCom.h" 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker #include "../7zip/Common/RegisterCodec.h" 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 23*f6dc9357SAndroid Build Coastguard Worker CXxh64Hasher 24*f6dc9357SAndroid Build Coastguard Worker , IHasher 25*f6dc9357SAndroid Build Coastguard Worker ) 26*f6dc9357SAndroid Build Coastguard Worker CXxh64 _state; 27*f6dc9357SAndroid Build Coastguard Worker public: 28*f6dc9357SAndroid Build Coastguard Worker Byte _mtDummy[1 << 7]; // it's public to eliminate clang warning: unused private field 29*f6dc9357SAndroid Build Coastguard Worker CXxh64Hasher() { Init(); } 30*f6dc9357SAndroid Build Coastguard Worker }; 31*f6dc9357SAndroid Build Coastguard Worker 32*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CXxh64Hasher::Init()) 33*f6dc9357SAndroid Build Coastguard Worker { 34*f6dc9357SAndroid Build Coastguard Worker Xxh64_Init(&_state); 35*f6dc9357SAndroid Build Coastguard Worker } 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CXxh64Hasher::Update(const void *data, UInt32 size)) 38*f6dc9357SAndroid Build Coastguard Worker { 39*f6dc9357SAndroid Build Coastguard Worker #if 1 40*f6dc9357SAndroid Build Coastguard Worker Xxh64_Update(&_state, data, size); 41*f6dc9357SAndroid Build Coastguard Worker #else // for debug: 42*f6dc9357SAndroid Build Coastguard Worker for (;;) 43*f6dc9357SAndroid Build Coastguard Worker { 44*f6dc9357SAndroid Build Coastguard Worker if (size == 0) 45*f6dc9357SAndroid Build Coastguard Worker return; 46*f6dc9357SAndroid Build Coastguard Worker UInt32 size2 = (size * 0x85EBCA87) % size / 8; 47*f6dc9357SAndroid Build Coastguard Worker if (size2 == 0) 48*f6dc9357SAndroid Build Coastguard Worker size2 = 1; 49*f6dc9357SAndroid Build Coastguard Worker Xxh64_Update(&_state, data, size2); 50*f6dc9357SAndroid Build Coastguard Worker data = (const void *)((const Byte *)data + size2); 51*f6dc9357SAndroid Build Coastguard Worker size -= size2; 52*f6dc9357SAndroid Build Coastguard Worker } 53*f6dc9357SAndroid Build Coastguard Worker #endif 54*f6dc9357SAndroid Build Coastguard Worker } 55*f6dc9357SAndroid Build Coastguard Worker 56*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CXxh64Hasher::Final(Byte *digest)) 57*f6dc9357SAndroid Build Coastguard Worker { 58*f6dc9357SAndroid Build Coastguard Worker const UInt64 val = Xxh64_Digest(&_state); 59*f6dc9357SAndroid Build Coastguard Worker SetUi64(digest, val) 60*f6dc9357SAndroid Build Coastguard Worker } 61*f6dc9357SAndroid Build Coastguard Worker 62*f6dc9357SAndroid Build Coastguard Worker REGISTER_HASHER(CXxh64Hasher, 0x211, "XXH64", 8) 63*f6dc9357SAndroid Build Coastguard Worker 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker 66*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_USE_HHX64_ORIGINAL 67*f6dc9357SAndroid Build Coastguard Worker namespace NOriginal 68*f6dc9357SAndroid Build Coastguard Worker { 69*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_IMP_COM_1( 70*f6dc9357SAndroid Build Coastguard Worker CXxh64Hasher 71*f6dc9357SAndroid Build Coastguard Worker , IHasher 72*f6dc9357SAndroid Build Coastguard Worker ) 73*f6dc9357SAndroid Build Coastguard Worker XXH64_state_t _state; 74*f6dc9357SAndroid Build Coastguard Worker public: 75*f6dc9357SAndroid Build Coastguard Worker Byte _mtDummy[1 << 7]; // it's public to eliminate clang warning: unused private field 76*f6dc9357SAndroid Build Coastguard Worker CXxh64Hasher() { Init(); } 77*f6dc9357SAndroid Build Coastguard Worker }; 78*f6dc9357SAndroid Build Coastguard Worker 79*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CXxh64Hasher::Init()) 80*f6dc9357SAndroid Build Coastguard Worker { 81*f6dc9357SAndroid Build Coastguard Worker XXH64_reset(&_state, 0); 82*f6dc9357SAndroid Build Coastguard Worker } 83*f6dc9357SAndroid Build Coastguard Worker 84*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CXxh64Hasher::Update(const void *data, UInt32 size)) 85*f6dc9357SAndroid Build Coastguard Worker { 86*f6dc9357SAndroid Build Coastguard Worker XXH64_update(&_state, data, size); 87*f6dc9357SAndroid Build Coastguard Worker } 88*f6dc9357SAndroid Build Coastguard Worker 89*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF2(void, CXxh64Hasher::Final(Byte *digest)) 90*f6dc9357SAndroid Build Coastguard Worker { 91*f6dc9357SAndroid Build Coastguard Worker const UInt64 val = XXH64_digest(&_state); 92*f6dc9357SAndroid Build Coastguard Worker SetUi64(digest, val) 93*f6dc9357SAndroid Build Coastguard Worker } 94*f6dc9357SAndroid Build Coastguard Worker 95*f6dc9357SAndroid Build Coastguard Worker REGISTER_HASHER(CXxh64Hasher, 0x212, "XXH64a", 8) 96*f6dc9357SAndroid Build Coastguard Worker } 97*f6dc9357SAndroid Build Coastguard Worker #endif 98