Skip to content

Commit c56a847

Browse files
authored
Add XXHash3 & XXHash128 implementations with tests (#43)
Implement the XXH3_64bits and XXH3_128bits (XXHash128) hash algorithms, following the official xxHash specification and existing codebase conventions. Both variants share core primitives via TXXH3Core (secret, accumulators, accumulation/scrambling pipeline, 64x64->128-bit scalar multiplication) defined in HlpXXHash3.pas. TXXHash128 in HlpXXHash128.pas reuses these shared primitives with its own 128-bit finalization logic. Closes #19
1 parent 62c602e commit c56a847

13 files changed

Lines changed: 1552 additions & 144 deletions

File tree

HashLib.Benchmark/Delphi/PerformanceBenchmarkConsole.dpr

Lines changed: 70 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -6,87 +6,39 @@ uses
66
Classes,
77
SysUtils,
88
uPerformanceBenchmark in '..\src\Core\uPerformanceBenchmark.pas',
9-
HlpCRC in '..\..\HashLib\src\Checksum\HlpCRC.pas',
10-
HlpICRC in '..\..\HashLib\src\Interfaces\HlpICRC.pas',
11-
HlpBitConverter in '..\..\HashLib\src\Utils\HlpBitConverter.pas',
12-
HlpGrindahl512 in '..\..\HashLib\src\Crypto\HlpGrindahl512.pas',
13-
HlpGrindahl256 in '..\..\HashLib\src\Crypto\HlpGrindahl256.pas',
14-
HlpHashFactory in '..\..\HashLib\src\Base\HlpHashFactory.pas',
15-
HlpCRC32Fast in '..\..\HashLib\src\Checksum\HlpCRC32Fast.pas',
16-
HlpCRC64 in '..\..\HashLib\src\Checksum\HlpCRC64.pas',
17-
HlpCRC32 in '..\..\HashLib\src\Checksum\HlpCRC32.pas',
18-
HlpBlake2B in '..\..\HashLib\src\Crypto\HlpBlake2B.pas',
19-
HlpFNV64 in '..\..\HashLib\src\Hash64\HlpFNV64.pas',
20-
HlpBits in '..\..\HashLib\src\Utils\HlpBits.pas',
21-
HlpConverters in '..\..\HashLib\src\Utils\HlpConverters.pas',
22-
HlpSHA3 in '..\..\HashLib\src\Crypto\HlpSHA3.pas',
23-
HlpIHashInfo in '..\..\HashLib\src\Interfaces\HlpIHashInfo.pas',
24-
HlpHashBuffer in '..\..\HashLib\src\Base\HlpHashBuffer.pas',
25-
HlpSnefru in '..\..\HashLib\src\Crypto\HlpSnefru.pas',
269
HlpHash in '..\..\HashLib\src\Base\HlpHash.pas',
27-
HlpXXHash32 in '..\..\HashLib\src\Hash32\HlpXXHash32.pas',
28-
HlpXXHash64 in '..\..\HashLib\src\Hash64\HlpXXHash64.pas',
10+
HlpKDF in '..\..\HashLib\src\Base\HlpKDF.pas',
11+
HlpHashBuffer in '..\..\HashLib\src\Base\HlpHashBuffer.pas',
2912
HlpHashCryptoNotBuildIn in '..\..\HashLib\src\Base\HlpHashCryptoNotBuildIn.pas',
13+
HlpHashFactory in '..\..\HashLib\src\Base\HlpHashFactory.pas',
14+
HlpHashResult in '..\..\HashLib\src\Base\HlpHashResult.pas',
15+
HlpHashRounds in '..\..\HashLib\src\Base\HlpHashRounds.pas',
16+
HlpHashSize in '..\..\HashLib\src\Base\HlpHashSize.pas',
3017
HlpHMACNotBuildInAdapter in '..\..\HashLib\src\Base\HlpHMACNotBuildInAdapter.pas',
31-
HlpPBKDF2_HMACNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF2_HMACNotBuildInAdapter.pas',
32-
HlpPBKDF_Argon2NotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_Argon2NotBuildInAdapter.pas',
33-
HlpArgon2TypeAndVersion in '..\..\HashLib\src\KDF\HlpArgon2TypeAndVersion.pas',
34-
HlpPBKDF_ScryptNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_ScryptNotBuildInAdapter.pas',
35-
HlpPanama in '..\..\HashLib\src\Crypto\HlpPanama.pas',
18+
HlpMultipleTransformNonBlock in '..\..\HashLib\src\Base\HlpMultipleTransformNonBlock.pas',
3619
HlpAdler32 in '..\..\HashLib\src\Checksum\HlpAdler32.pas',
37-
HlpAP in '..\..\HashLib\src\Hash32\HlpAP.pas',
38-
HlpBernstein in '..\..\HashLib\src\Hash32\HlpBernstein.pas',
39-
HlpBernstein1 in '..\..\HashLib\src\Hash32\HlpBernstein1.pas',
40-
HlpBKDR in '..\..\HashLib\src\Hash32\HlpBKDR.pas',
41-
HlpBlake2S in '..\..\HashLib\src\Crypto\HlpBlake2S.pas',
20+
HlpCRC in '..\..\HashLib\src\Checksum\HlpCRC.pas',
4221
HlpCRC16 in '..\..\HashLib\src\Checksum\HlpCRC16.pas',
43-
HlpDEK in '..\..\HashLib\src\Hash32\HlpDEK.pas',
44-
HlpDJB in '..\..\HashLib\src\Hash32\HlpDJB.pas',
45-
HlpELF in '..\..\HashLib\src\Hash32\HlpELF.pas',
46-
HlpFNV in '..\..\HashLib\src\Hash32\HlpFNV.pas',
47-
HlpFNV1a in '..\..\HashLib\src\Hash32\HlpFNV1a.pas',
48-
HlpFNV1a64 in '..\..\HashLib\src\Hash64\HlpFNV1a64.pas',
22+
HlpCRC32 in '..\..\HashLib\src\Checksum\HlpCRC32.pas',
23+
HlpCRC32Fast in '..\..\HashLib\src\Checksum\HlpCRC32Fast.pas',
24+
HlpCRC64 in '..\..\HashLib\src\Checksum\HlpCRC64.pas',
4925
HlpGost in '..\..\HashLib\src\Crypto\HlpGost.pas',
50-
HlpGOST3411_2012 in '..\..\HashLib\src\Crypto\HlpGOST3411_2012.pas',
26+
HlpGrindahl256 in '..\..\HashLib\src\Crypto\HlpGrindahl256.pas',
27+
HlpGrindahl512 in '..\..\HashLib\src\Crypto\HlpGrindahl512.pas',
5128
HlpHAS160 in '..\..\HashLib\src\Crypto\HlpHAS160.pas',
52-
HlpHashLibTypes in '..\..\HashLib\src\Utils\HlpHashLibTypes.pas',
53-
HlpHashResult in '..\..\HashLib\src\Base\HlpHashResult.pas',
54-
HlpHashRounds in '..\..\HashLib\src\Base\HlpHashRounds.pas',
55-
HlpHashSize in '..\..\HashLib\src\Base\HlpHashSize.pas',
5629
HlpHaval in '..\..\HashLib\src\Crypto\HlpHaval.pas',
57-
HlpBlake2BP in '..\..\HashLib\src\Crypto\HlpBlake2BP.pas',
58-
HlpBlake2SP in '..\..\HashLib\src\Crypto\HlpBlake2SP.pas',
59-
HlpBlake3 in '..\..\HashLib\src\Crypto\HlpBlake3.pas',
60-
HlpIHash in '..\..\HashLib\src\Interfaces\HlpIHash.pas',
61-
HlpIHashResult in '..\..\HashLib\src\Interfaces\HlpIHashResult.pas',
62-
HlpIKDF in '..\..\HashLib\src\Interfaces\HlpIKDF.pas',
63-
HlpJenkins3 in '..\..\HashLib\src\Hash32\HlpJenkins3.pas',
64-
HlpJS in '..\..\HashLib\src\Hash32\HlpJS.pas',
65-
HlpKDF in '..\..\HashLib\src\Base\HlpKDF.pas',
6630
HlpMD2 in '..\..\HashLib\src\Crypto\HlpMD2.pas',
6731
HlpMD4 in '..\..\HashLib\src\Crypto\HlpMD4.pas',
6832
HlpMD5 in '..\..\HashLib\src\Crypto\HlpMD5.pas',
6933
HlpMDBase in '..\..\HashLib\src\Crypto\HlpMDBase.pas',
70-
HlpMultipleTransformNonBlock in '..\..\HashLib\src\Base\HlpMultipleTransformNonBlock.pas',
71-
HlpMurmur2 in '..\..\HashLib\src\Hash32\HlpMurmur2.pas',
72-
HlpMurmur2_64 in '..\..\HashLib\src\Hash64\HlpMurmur2_64.pas',
73-
HlpMurmurHash3_x64_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x64_128.pas',
74-
HlpMurmurHash3_x86_32 in '..\..\HashLib\src\Hash32\HlpMurmurHash3_x86_32.pas',
75-
HlpMurmurHash3_x86_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x86_128.pas',
76-
HlpSipHash128 in '..\..\HashLib\src\Hash128\HlpSipHash128.pas',
77-
HlpNullDigest in '..\..\HashLib\src\NullDigest\HlpNullDigest.pas',
78-
HlpOneAtTime in '..\..\HashLib\src\Hash32\HlpOneAtTime.pas',
79-
HlpPJW in '..\..\HashLib\src\Hash32\HlpPJW.pas',
34+
HlpPanama in '..\..\HashLib\src\Crypto\HlpPanama.pas',
8035
HlpRadioGatun32 in '..\..\HashLib\src\Crypto\HlpRadioGatun32.pas',
8136
HlpRadioGatun64 in '..\..\HashLib\src\Crypto\HlpRadioGatun64.pas',
8237
HlpRIPEMD in '..\..\HashLib\src\Crypto\HlpRIPEMD.pas',
8338
HlpRIPEMD128 in '..\..\HashLib\src\Crypto\HlpRIPEMD128.pas',
8439
HlpRIPEMD160 in '..\..\HashLib\src\Crypto\HlpRIPEMD160.pas',
8540
HlpRIPEMD256 in '..\..\HashLib\src\Crypto\HlpRIPEMD256.pas',
8641
HlpRIPEMD320 in '..\..\HashLib\src\Crypto\HlpRIPEMD320.pas',
87-
HlpRotating in '..\..\HashLib\src\Hash32\HlpRotating.pas',
88-
HlpRS in '..\..\HashLib\src\Hash32\HlpRS.pas',
89-
HlpSDBM in '..\..\HashLib\src\Hash32\HlpSDBM.pas',
9042
HlpSHA0 in '..\..\HashLib\src\Crypto\HlpSHA0.pas',
9143
HlpSHA1 in '..\..\HashLib\src\Crypto\HlpSHA1.pas',
9244
HlpSHA2_224 in '..\..\HashLib\src\Crypto\HlpSHA2_224.pas',
@@ -97,17 +49,67 @@ uses
9749
HlpSHA2_512_224 in '..\..\HashLib\src\Crypto\HlpSHA2_512_224.pas',
9850
HlpSHA2_512_256 in '..\..\HashLib\src\Crypto\HlpSHA2_512_256.pas',
9951
HlpSHA2_512Base in '..\..\HashLib\src\Crypto\HlpSHA2_512Base.pas',
100-
HlpShiftAndXor in '..\..\HashLib\src\Hash32\HlpShiftAndXor.pas',
101-
HlpSipHash in '..\..\HashLib\src\Hash64\HlpSipHash.pas',
102-
HlpSuperFast in '..\..\HashLib\src\Hash32\HlpSuperFast.pas',
52+
HlpSHA3 in '..\..\HashLib\src\Crypto\HlpSHA3.pas',
53+
HlpSnefru in '..\..\HashLib\src\Crypto\HlpSnefru.pas',
10354
HlpTiger in '..\..\HashLib\src\Crypto\HlpTiger.pas',
10455
HlpTiger2 in '..\..\HashLib\src\Crypto\HlpTiger2.pas',
10556
HlpWhirlPool in '..\..\HashLib\src\Crypto\HlpWhirlPool.pas',
106-
HlpArrayUtils in '..\..\HashLib\src\Utils\HlpArrayUtils.pas',
107-
HlpBlake2SParams in '..\..\HashLib\src\Crypto\Blake2SParams\HlpBlake2SParams.pas',
57+
HlpGOST3411_2012 in '..\..\HashLib\src\Crypto\HlpGOST3411_2012.pas',
58+
HlpBlake2B in '..\..\HashLib\src\Crypto\HlpBlake2B.pas',
59+
HlpBlake2S in '..\..\HashLib\src\Crypto\HlpBlake2S.pas',
10860
HlpBlake2BParams in '..\..\HashLib\src\Crypto\Blake2BParams\HlpBlake2BParams.pas',
61+
HlpBlake2SParams in '..\..\HashLib\src\Crypto\Blake2SParams\HlpBlake2SParams.pas',
62+
HlpNullDigest in '..\..\HashLib\src\NullDigest\HlpNullDigest.pas',
63+
HlpAP in '..\..\HashLib\src\Hash32\HlpAP.pas',
64+
HlpBernstein in '..\..\HashLib\src\Hash32\HlpBernstein.pas',
65+
HlpBernstein1 in '..\..\HashLib\src\Hash32\HlpBernstein1.pas',
66+
HlpBKDR in '..\..\HashLib\src\Hash32\HlpBKDR.pas',
67+
HlpDEK in '..\..\HashLib\src\Hash32\HlpDEK.pas',
68+
HlpDJB in '..\..\HashLib\src\Hash32\HlpDJB.pas',
69+
HlpELF in '..\..\HashLib\src\Hash32\HlpELF.pas',
70+
HlpFNV in '..\..\HashLib\src\Hash32\HlpFNV.pas',
71+
HlpFNV1a in '..\..\HashLib\src\Hash32\HlpFNV1a.pas',
72+
HlpJenkins3 in '..\..\HashLib\src\Hash32\HlpJenkins3.pas',
73+
HlpJS in '..\..\HashLib\src\Hash32\HlpJS.pas',
74+
HlpMurmur2 in '..\..\HashLib\src\Hash32\HlpMurmur2.pas',
75+
HlpMurmurHash3_x86_32 in '..\..\HashLib\src\Hash32\HlpMurmurHash3_x86_32.pas',
76+
HlpOneAtTime in '..\..\HashLib\src\Hash32\HlpOneAtTime.pas',
77+
HlpPJW in '..\..\HashLib\src\Hash32\HlpPJW.pas',
78+
HlpRotating in '..\..\HashLib\src\Hash32\HlpRotating.pas',
79+
HlpRS in '..\..\HashLib\src\Hash32\HlpRS.pas',
80+
HlpSDBM in '..\..\HashLib\src\Hash32\HlpSDBM.pas',
81+
HlpShiftAndXor in '..\..\HashLib\src\Hash32\HlpShiftAndXor.pas',
82+
HlpSuperFast in '..\..\HashLib\src\Hash32\HlpSuperFast.pas',
83+
HlpXXHash32 in '..\..\HashLib\src\Hash32\HlpXXHash32.pas',
84+
HlpFNV1a64 in '..\..\HashLib\src\Hash64\HlpFNV1a64.pas',
85+
HlpFNV64 in '..\..\HashLib\src\Hash64\HlpFNV64.pas',
86+
HlpMurmur2_64 in '..\..\HashLib\src\Hash64\HlpMurmur2_64.pas',
87+
HlpSipHash in '..\..\HashLib\src\Hash64\HlpSipHash.pas',
88+
HlpXXHash64 in '..\..\HashLib\src\Hash64\HlpXXHash64.pas',
89+
HlpXXHash3 in '..\..\HashLib\src\Hash64\HlpXXHash3.pas',
90+
HlpMurmurHash3_x86_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x86_128.pas',
91+
HlpMurmurHash3_x64_128 in '..\..\HashLib\src\Hash128\HlpMurmurHash3_x64_128.pas',
92+
HlpSipHash128 in '..\..\HashLib\src\Hash128\HlpSipHash128.pas',
93+
HlpXXHash128 in '..\..\HashLib\src\Hash128\HlpXXHash128.pas',
94+
HlpIHash in '..\..\HashLib\src\Interfaces\HlpIHash.pas',
95+
HlpIKDF in '..\..\HashLib\src\Interfaces\HlpIKDF.pas',
96+
HlpICRC in '..\..\HashLib\src\Interfaces\HlpICRC.pas',
97+
HlpIHashInfo in '..\..\HashLib\src\Interfaces\HlpIHashInfo.pas',
98+
HlpIHashResult in '..\..\HashLib\src\Interfaces\HlpIHashResult.pas',
99+
HlpIBlake2BParams in '..\..\HashLib\src\Interfaces\IBlake2BParams\HlpIBlake2BParams.pas',
109100
HlpIBlake2SParams in '..\..\HashLib\src\Interfaces\IBlake2SParams\HlpIBlake2SParams.pas',
110-
HlpIBlake2BParams in '..\..\HashLib\src\Interfaces\IBlake2BParams\HlpIBlake2BParams.pas';
101+
HlpBlake2BP in '..\..\HashLib\src\Crypto\HlpBlake2BP.pas',
102+
HlpBlake2SP in '..\..\HashLib\src\Crypto\HlpBlake2SP.pas',
103+
HlpBlake3 in '..\..\HashLib\src\Crypto\HlpBlake3.pas',
104+
HlpPBKDF2_HMACNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF2_HMACNotBuildInAdapter.pas',
105+
HlpPBKDF_Argon2NotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_Argon2NotBuildInAdapter.pas',
106+
HlpArgon2TypeAndVersion in '..\..\HashLib\src\KDF\HlpArgon2TypeAndVersion.pas',
107+
HlpPBKDF_ScryptNotBuildInAdapter in '..\..\HashLib\src\KDF\HlpPBKDF_ScryptNotBuildInAdapter.pas',
108+
HlpConverters in '..\..\HashLib\src\Utils\HlpConverters.pas',
109+
HlpBitConverter in '..\..\HashLib\src\Utils\HlpBitConverter.pas',
110+
HlpBits in '..\..\HashLib\src\Utils\HlpBits.pas',
111+
HlpHashLibTypes in '..\..\HashLib\src\Utils\HlpHashLibTypes.pas',
112+
HlpArrayUtils in '..\..\HashLib\src\Utils\HlpArrayUtils.pas';
111113

112114
var
113115
StringList: TStringList;

0 commit comments

Comments
 (0)