Hash-Funktion | MiB/Sek | zykl./hash | Radl./Karte | Größe | Qualitätsprobleme |
---|---|---|---|---|---|
donothing32 | 11149460.06 | 4.00 | - | 13 | Schlechter Seed 0, Test NOP |
donothing64 | 11787676.42 | 4.00 | - | 13 | Schlechter Seed 0, Test NOP |
donothing128 | 11745060.76 | 4.06 | - | 13 | Schlechter Seed 0, Test NOP |
NOP_OAAT_read64 | 11372846.37 | 14.00 | - | 47 | Test NEIN |
BadHash | 769,94 | 73,97 | - | 47 | Schlechter Seed 0, Test FAIL |
Sumhash | 10699.57 | 29.53 | - | 363 | Schlechter Seed 0, Test FAIL |
sumhash32 | 42877,79 | 23.12 | - | 863 | UB, Test FAIL |
multiply_shift | 8026.77 | 26.05 | 226,80 (8) | 345 | schlechte Seeds & 0xfffffff0, schlägt die meisten Tests fehl |
pair_multiply_shift | 3716,95 | 40.22 | 186,34 (3) | 609 | besteht die meisten Tests nicht |
-------------------------- | |||||
crc32 | 383.12 | 134.21 | 257,50 (11) | 422 | unsicher, 8590x Kollisionen, Verteilung, PerlinNoise |
md5_32 | 350,53 | 644,31 | 894,12 (10) | 4419 | |
md5_64 | 351.01 | 656,67 | 897,43 (12) | 4419 | |
MD5-128 | 350,89 | 681,88 | 894,03 (13) | 4419 | |
sha1_32 | 353.03 | 1385,80 | 1759,94 (5) | 5126 | Vernunft, zyklisch niedrig32, 36,6 % Verteilung |
sha1_64 | 353.03 | 1385,80 | 1759,94 (5) | 5126 | Vernunft, zyklisch niedrig32, 36,6 % Verteilung |
sha1-160 | 364,95 | 1470,55 | 1794.16 (13) | 5126 | Kamm/zyklisch niedrig32 |
sha2-224 | 147.13 | 1354,81 | 1589,92 (12) | Kamm niedrig32 | |
sha2-224_64 | 147,60 | 1360.10 | 1620,93 (13) | Zyklisches Tief32 | |
sha2-256 | 147,80 | 1374,90 | 1606.06 (16) | ||
sha2-256_64 | 148.01 | 1376,34 | 1624,71 (16) | ||
sha1ni | 1601.21 | 174.16 | 397,28 (6) | 989 | unsicher, vernünftig, Permutation, Nullen, maschinenspezifisch |
sha1ni_32 | 1576.17 | 174.04 | 405,56 (6) | 989 | maschinenspezifisch |
sha2ni-256 | 1527,38 | 184,35 | 404,40 (4) | 4241 | unsicher, vernünftig, Permutation, Nullen, maschinenspezifisch |
sha2ni-256_64 | 1501,85 | 186,20 | 407,96 (5) | 4241 | Nullen, maschinenspezifisch |
blake3_c | 1288,84 | 357,69 | 582,89 (6) | keine 32-Bit-Portabilität | |
rmd128 | 290,90 | 710,49 | 965,55 (6) | ||
rmd160 | 202.16 | 1045,79 | 1287,74 (16) | Zyklisches hi32 | |
rmd256 | 364,81 | 584,86 | 835.02 (11) | ||
edonr224 | 864,69 | 303.42 | 526,94 (6) | ||
edonr256 | 847,85 | 305,79 | 510.01 (4) | ||
blake2s-128 | 295,30 | 698.09 | 1059,24 (51) | ||
blake2s-160 | 215.01 | 1026,74 | 1239,54 (11) | ||
blake2s-224 | 207.06 | 1063,86 | 1236,50 (20) | ||
blake2s-256 | 215,28 | 1014,88 | 1230,38 (28) | ||
blake2s-256_64 | 211,52 | 1044.22 | 1228,43 (8) | ||
blake2b-160 | 356.08 | 1236,84 | 1458,15 (12) | ||
blake2b-224 | 356,59 | 1228,50 | 1425,87 (16) | ||
blake2b-256 | 355,97 | 1232.22 | 1443,31 (19) | ||
blake2b-256_64 | 356,97 | 1222,76 | 1435.03 (9) | ||
asconhashv12 | 144,98 | 885.02 | 1324,23 (38) | 4341 | |
asconhashv12_64 | 159,68 | 386,90 | 480,86 (4) | 6490 | |
sha3-256 | 100,58 | 3877,18 | 4159,79 (37) | PerlinNoise | |
sha3-256_64 | 100,57 | 3909,00 | 4174,63 (16) | PerlinNoise | |
hasshe2 | 2773,89 | 64,35 | 282,30 (3) | 445 | Permutation, zwei Bytes, Nullen, Startwert |
poly_1_mersenne | 1369.21 | 61,59 | 248,86 (4) | 479 | besteht die meisten Tests nicht |
poly_2_mersenne | 1364.03 | 70.30 | 261,00 (6) | 479 | |
poly_3_mersenne | 1342,82 | 80,22 | 268,79 (2) | 479 | |
poly_4_mersenne | 1343.19 | 89.13 | 277,52 (3) | 479 | |
Tabellierung32 | 5781.16 | 40,00 | 241,79 (10) | 848 | Kollisionen |
Tabellierung | 7875.01 | 39,95 | 249,49 (3) | 554 | |
crc32_hw | 6244,38 | 41.23 | 226,80 (2) | 653 | unsicher, 100 % Bias, Kollisionen, Verteilung, BIC, maschinenspezifisch (SSE4.2/NEON) |
crc32_hw1 | 7569,29 | 49.07 | 233,75 (3) | 671 | Unsicher, 100 % Bias, Kollisionen, Verteilung, BIC, maschinenspezifisch (x86 SSE4.2) |
crc64_hw | 6143.62 | 40,48 | 223,13 (2) | 652 | unsicher, 100 % Bias, Kollisionen, Verteilung, BIC, maschinenspezifisch (SSE4.2/NEON) |
crc32_pclmul | - | - | - | Unsicher, 100 % Bias, Kollisionen, Verteilung, BIC, maschinenspezifisch (x86 SSE4.2+PCLMUL) | |
o1hash | 11629440.57 | 18.15 | 199,35 (2) | 101 | unsicher, kein Startwert, Nullen, schlägt bei allen Tests fehl |
Fibonacci | 16878.32 | 22.94 | 803.18 (15) | 1692 | UB, Nullen, alle Tests nicht bestanden |
FNV1a | 760,52 | 73,83 | 254,29 (5) | 204 | Schlechter Startwert, Nullen, alle Tests sind fehlgeschlagen |
FNV1A_Totenschiff | 6274,78 | 26.23 | 251,13 (2) | 270 | UB, Nullen, alle Tests nicht bestanden |
FNV1A_Pippip_Yurii | 6172.14 | 27.55 | 244,80 (2) | 147 | UB, Vernunft, besteht alle Tests nicht |
FNV1a_YT | 13486,49 | 30,50 | 237,43 (4) | 321 | Schlechter Seed, UB, besteht alle Tests nicht |
FNV2 | 6171,60 | 32.20 | 208,59 (4) | 278 | besteht alle Tests nicht |
FNV64 | 774,37 | 72,43 | 201,15 (2) | 79 | besteht alle Tests nicht |
FNV128 | 390,14 | 136,42 | 289,00 (3) | 171 | besteht alle Tests nicht |
k-hash32 | 2230.42 | 53.05 | 264,64 (3) | 808 | unsicher, Nullen, UB, schlechte Seeds, schlägt alle Tests fehl |
k-hash64 | 2451,88 | 48,66 | 249,44 (2) | 609 | unsicher, Nullen, UB, schlechte Seeds, schlägt alle Tests fehl |
fletcher2 | 15552.61 | 20.61 | 335,31 (3) | 248 | Schlechter Startwert 0, UB, schlägt alle Tests fehl |
fletcher4 | 15556.93 | 20.60 | 358,60 (3) | 371 | Schlechter Startwert 0, UB, schlägt alle Tests fehl |
Bernstein | 1045,97 | 58.31 | 225,78 (3) | 41 | Schlechter Startwert 0, alle Tests sind fehlgeschlagen |
sdbm | 784,83 | 68,57 | 222,68 (5) | 41 | Schlechter Startwert 0, alle Tests sind fehlgeschlagen |
x17 | 748,75 | 74.13 | 236,00 (10) | 79 | 99,98 % Bias, alle Tests nicht bestanden |
Freiheit | 628,66 | 84,95 | 225,07 (4) | 37 | unsicher, 100 % voreingenommen, alle Tests nicht bestanden, schlechter Seed |
gcc | 611,69 | 86,47 | 231,51 (5) | 39 | unsicher, 100 % voreingenommen, alle Tests nicht bestanden, schlechter Seed |
JenkinsOOAT | 627,64 | 107.04 | 252,79 (3) | 153 | Schlechter Startwert 0, 53,5 % Bias, alle Tests nicht bestanden |
JenkinsOOAT_perl | 608.10 | 94,17 | 254,09 (4) | 65 | Schlechter Seed 0, 1,5–11,5 % Bias, 7,2x Kollisionen, BIC, LongNeighbors |
MicroOAAT | 701.35 | 76,68 | 251,01 (3) | 68 | 100 % Bias, Verteilung, BIC |
pearsonhash64 | 434.17 | 124.14 | 230,79 (4) | Nur Avalanche, Seed, SSSE3. defekte MSVC | |
pearsonhash128 | 434.23 | 121,34 | 221,03 (7) | Nur Avalanche, Seed, SSSE3. defekte MSVC | |
pearsonhash256 | 444.08 | 119.11 | 229,75 (4) | Nur Avalanche, Seed, SSSE3. defekte MSVC | |
VHASH_32 | 13053.40 | 65,84 | 289,86 (3) | 1231 | Vernunft, Samen, MomentChi2 |
VHASH_64 | 13465,50 | 63,88 | 286,38 (5) | 1231 | Vernunft, Samen, spärlich |
farsh32 | 27038.23 | 66,88 | 278,89 (5) | 944 | unsicher: AppendedZeroes, Kollisionen+Bias, MomentChi2, LongNeighbors |
farsh64 | 13829.32 | 112,46 | 332,59 (3) | 944 | unsicher: AppendedZeroes, Kollisionen+Bias, MomentChi2, LongNeighbors |
farsh128 | 6878,88 | 233,35 | 384,85 (3) | 944 | unsicher: Angehängte Nullen, Kollisionen + Voreingenommenheit, Permut, Kombination, 2 Bytes, Nullen, PerlinNoise |
farsh256 | 3467,37 | 440,40 | 593,57 (5) | 944 | unsicher: Angehängte Nullen, Kollisionen + Voreingenommenheit, Permut, Kombination, 2 Bytes, Nullen, PerlinNoise |
jodyhash32 | 1794.34 | 41.12 | 235,12 (4) | 102 | Bias, Kollisionen, Distr, BIC LongNeighbors |
jodyhash64 | 4813.10 | 40,72 | 239,22 (6) | 118 | Bias, Kollisionen, Distr, BIC, LongNeighbors |
Lookup3 | 2475,35 | 39,65 | 240,10 (3) | 341 | UB, 28 % Bias, Kollisionen, 30 % Distr, BIC |
superschnell | 2058.22 | 49,56 | 254,12 (3) | 210 | UB, schlechter Startwert 0, 91 % Bias, 5273,01x Kollisionen, 37 % Distr, BIC |
MurmurOAAT | 506,66 | 103,33 | 236,89 (3) | 47 | Schlechter Seed 0, Kollisionen, 99,998 % Verteilung, BIC, LongNeighbors |
Mist8 | 3041.14 | 37.25 | 247,87 (4) | 342 | UB, 2,42 % Bias, Kollisionen, 2 % Verteilung |
Murmeln1 | 2027.85 | 48,51 | 253,34 (3) | 358 | UB, 1 schlechter Startwert, 511x Kollisionen, Diff, BIC |
Murmeln2 | 3089.18 | 41.22 | 238,42 (4) | 358 | UB, 1 schlechter Samen, 1,7 % Bias, 81x Coll, 1,7 % Verteilung, BIC |
Murmur2A | 3087,98 | 45,90 | 238,54 (4) | 407 | UB, 1 schlechter Samen, 12,7 % Bias, LongNeighbors |
Murmur2B | 5919.38 | 38.18 | 215,96 (3) | 433 | UB, 1,8 % Bias, Kollisionen, 3,4 % Verteilung, BIC |
Murmur2C | 3810,98 | 49.09 | 218,51 (3) | 444 | UB, 2^32 schlechte Seeds, 91 % Bias, Kollisionen, Distr, BIC, LongNeighbors |
Murmur3A | 2982,67 | 49.08 | 245,78 (4) | 351 | UB, 1 schlechter Samen, Moment Chi2 69 |
PMurHash32 | 3005,85 | 48,88 | 242,38 (3) | 1862 | 1 schlechter Samen, Moment Chi2 69 |
Murmur3C | 4833.18 | 56,87 | 250,47 (6) | 859 | UB, LongNeighbors, Text, DiffDist |
mirhash32low | 6145,39 | 36,95 | 235,09 (4) | 1112 | UB, 4 schlechte Seeds, zyklisch, LongNeighbors, maschinenspezifisch (32/64 unterschiedlich) |
PMPML_32 | 6639,68 | 45,33 | 257,45 (3) | 1084 | Avalanche >512, ungesetzt: Seed, BIC, MomentChi2, PerlinNoise |
PMPML_64 | 9833,77 | 50,00 | 251,64 (6) | 1305 | ungesät: Seed, MomentChi2, BIC |
xxHash32 | 5865.17 | 49.20 | 242,74 (3) | 738 | LongNeighbors, Kollisionen mit 4-Bit-Diff, MomentChi2 220 |
metrohash64 | 14741.56 | 39,44 | 215,76 (2) | 624 | UB, LongNeighbors, BIC |
metrohash64_1 | 14298,77 | 40.31 | 223,25 (4) | 624 | UB, LongNeighbors, BIC, MomentChi2 |
metrohash64crc_1 | 6929,69 | 44,65 | 223,68 (3) | 632 | UB, zyklisch 8/8 Byte, DiffDist, BIC, MomentChi2, maschinenspezifisch (SSE4.2/NEON) |
metrohash64crc_2 | 8150,65 | 43,72 | 219,45 (5) | 632 | UB, zyklisch 8/8 Byte, DiffDist, BIC, maschinenspezifisch (SSE4.2/NEON) |
cmetrohash64_1o | 14921.73 | 38,95 | 213,25 (2) | 3506 | UB, LongNeighbors, BIC, MomentChi2 |
cmetrohash64_1 | 14151.73 | 40,90 | 211,89 (2) | 652 | UB, LongNeighbors, BIC, MomentChi2 |
City64noSeed | 14209.19 | 31,80 | 225,90 (5) | 1038 | Avalanche, Sparse, TwoBytes, MomentChi2, Seed |
Stadt64 | 13887,84 | 46,32 | 239,77 (3) | 1120 | Sparse, TwoBytes |
t1ha1_64le | 13442.64 | 31.41 | 219,58 (3) | 517 | Lawine |
t1ha1_64be | 11586.02 | 32,74 | 232,55 (3) | 555 | Lawine |
t1ha0_32le | 7401.21 | 48.27 | 238,99 (3) | 509 | Sparse, LongNeighbors |
t1ha0_32be | 6217,37 | 50,66 | 244,51 (3) | 533 | Sparse, LongNeighbors |
t1ha2_stream | 14011.63 | 80,72 | 275,17 (3) | 1665 | Sparse, Permutation, LongNeighbors |
t1ha2_stream128 | 13136.06 | 97,80 | 306.11 (7) | 1665 | Sparse, Permutation, LongNeighbors |
aesnihash | 5579,32 | 56,83 | 258,71 (5) | 1209 | besteht viele Tests nicht, maschinenspezifisch (x64 AES-NI) |
Falkasch | 50631.69 | 123.02 | 322,14 (7) | 264 | Sparse, LongNeighbors, maschinenspezifisch (x64 AES-NI) |
MeowHash | 29969,40 | 64,96 | 274,29 (4) | 1764 | Sparse, invertierbar, maschinenspezifisch (x64 AES-NI) |
MeowHash64low | 29485.59 | 65,98 | 278,05 (3) | 1764 | Sparse, invertierbar, maschinenspezifisch (x64 AES-NI) |
MeowHash32low | 26944.58 | 65,95 | 292,79 (9) | 1764 | Sparse, invertierbar, maschinenspezifisch (x64 AES-NI) |
-------------------------------------- | |||||
tifuhash_64 | 35,60 | 1679.52 | 1212,75 (15) | 276 | Zyklisches Tief32 |
floppsyhash | 35,72 | 1868.92 | 1411.07 (7) | 623 | |
Strahlteiler | 789,22 | 682,45 | 1150,33 (26) | 4203 | UB |
discohash1 | 4131.12 | 199,00 | 398,35 (5) | 1294 | |
discohash1-128 | 4072,95 | 234.17 | 438,43 (5) | 1294 | |
discohash2 | 3986,52 | 207,52 | 421,99 (2) | 1294 | |
discohash2-128 | 4094,73 | 236,61 | 433,35 (4) | 1294 | |
discoNONG | 3698,45 | 399,67 | 597,78 (9) | schlechte Samen | |
chaskey | 1143.05 | 113,70 | 294,43 (4) | 1609 | PerlinNoise |
SipHash | 943,53 | 147.15 | 338,74 (4) | 1071 | |
HalfSipHash | 1141,57 | 79,65 | 263,96 (3) | 700 | Nullen |
GutOAAT | 743,81 | 85,62 | 231,22 (3) | 237 | |
pearsonbhash64 | 1794.83 | 97,80 | 268,90 (8) | 683 | |
pearsonbhash128 | 1691.62 | 104,57 | 272,38 (4) | 1134 | |
pearsonbhash256 | 1442,59 | 126.04 | 309,34 (4) | 844 | |
prvhash64_64m | 3077.18 | 47.31 | 241,92 (3) | 349 | |
prvhash64_64 | 3015.08 | 48.03 | 240,64 (3) | 384 | |
prvhash64_128 | 3353,81 | 67,64 | 266,32 (2) | 718 | |
prvhash64s_64 | 6591,34 | 273,50 | 464,65 (3) | 2640 | |
prvhash64s_128 | 6581,40 | 333,83 | 528,07 (5) | 2799 | |
SipHash13 | 1812.75 | 106,56 | 310,76 (5) | 778 | 0,9 % Abweichung |
TSip | 4233.17 | 53.31 | 249,19 (3) | 519 | !msvc |
Seahash | 8261,80 | 58,94 | 256,08 (4) | 871 | PerlinNoise, !msvc |
seahash32low | 8266.17 | 58,90 | 290,21 (16) | 871 | PerlinNoise 32, !msvc |
clhash | 18703.04 | 70.19 | 282,12 (6) | 1809 | PerlinNoise, maschinenspezifisch (x64 SSE4.2) |
HighwayHash64 | 6242,58 | 99,55 | 248,41 (3) | 2546 | |
Murmur3F | 7623.44 | 52,69 | 221,87 (3) | 699 | UB |
MAMA | 9563,99 | 34,99 | 228,55 (5) | 1912 | UB, zu viele schlechte Samen, maschinenspezifisch (32/64 unterschiedlich) |
MUMlow | 9261,89 | 36.17 | 247,66 (4) | 1912 | UB, 5 schlechte Samen |
xmsx32 | 2039.10 | 46,39 | 249,30 (7) | 192 | 2 schlechte Samen |
Mirhash | 6139.07 | 37.02 | 209,47 (3) | 1112 | UB, 2^36 schlechte Samen, LongNeighbors, maschinenspezifisch (32/64 unterscheidet sich) |
mirhashstrict | 3549.01 | 49,99 | 224,91 (2) | 1112 | |
mirhashstrict32low | 3441,35 | 50,60 | 247,19 (3) | 1112 | 1 schlechter Samen, MomentChi2 9 |
fasthash32 | 6128.28 | 40.30 | 241,64 (4) | 566 | UB |
fasthash64 | 5818,92 | 38,70 | 220,74 (2) | 509 | UB |
aesni | 31232.34 | 29.21 | 230,14 (4) | 519 | maschinenspezifisch (x64 AES-NI) |
aesni-low | 31221.14 | 29.64 | 226,18 (3) | 519 | maschinenspezifisch (x64 AES-NI) |
mx3 | 9034,90 | 48,71 | 227,89 (2) | 734 | UB |
pengyhash | 13428,80 | 74,24 | 275,42 (5) | 421 | |
Stadt32 | 5551.28 | 54,40 | 261,64 (2) | 1319 | |
Stadt64low | 13904.10 | 46.24 | 260,08 (3) | 1120 | |
Stadt128 | 14031.96 | 89.09 | 290,05 (10) | 1841 | |
CityCrc128 | 7916.44 | 55,50 | 240,79 (2) | 295 | |
FarmHash32 | 21755.58 | 47,54 | 258,35 (3) | 11489 | maschinenspezifisch (x64 SSE4/AVX) |
FarmHash64 | 12845.53 | 47.11 | 251,58 (3) | 3758 | |
FarmHash128 | 13913,65 | 70,25 | 263,06 (3) | 163 | |
farmhash32_c | 21601.86 | 47,38 | 273,00 (3) | 762 | maschinenspezifisch (x64 SSE4/AVX) |
farmhash64_c | 12834.10 | 47.23 | 246,20 (2) | 3688 | |
farmhash128_c | 13753.24 | 68,96 | 263,76 (3) | 1890 | |
metrohash64_2 | 14316.37 | 40.23 | 218,28 (3) | 627 | UB, LongNeighbors |
cmetrohash64_2 | 14294.26 | 40,76 | 221,40 (4) | 655 | Lange Nachbarn |
metrohash128 | 15634.66 | 73,28 | 261,23 (4) | 773 | UB, LongNeighbors |
metrohash128_1 | 15806.97 | 72.30 | 260,90 (4) | 773 | UB, LongNeighbors |
metrohash128_2 | 15822,60 | 72.30 | 255,34 (3) | 773 | UB, LongNeighbors |
metrohash128crc_1 | 8009.23 | 78,72 | 281,55 (13) | 723 | UB, maschinenspezifisch (SSE4.2/NEON) |
metrohash128crc_2 | 7878.22 | 79,90 | 275,22 (4) | 723 | UB, maschinenspezifisch (SSE4.2/NEON) |
xxHash64 | 12108.87 | 49,78 | 228,83 (2) | 1999 | |
Gruselig32 | 13108.95 | 56,27 | 255,36 (3) | 2221 | UB |
Gruselig64 | 13529.36 | 58,76 | 236,31 (3) | 2221 | UB |
Gruselig128 | 11781,35 | 58,91 | 242,91 (3) | 2221 | UB |
GruseligV2_32 | 13529.16 | 55,55 | 248,37 (4) | 2069 | |
GruseligV2_64 | 12678,82 | 56,71 | 243,21 (4) | 2069 | |
GruseligV2_128 | 13512.82 | 58,33 | 244,56 (5) | 2069 | |
ahash64 | 9862.62 | 27.32 | 181,68 (1) | 412 | Rost |
xxh3 | 21033.55 | 29.48 | 226,77 (4) | 744 | DiffDist Bit 7 w. 36 Bit, BIC |
xxh3low | 17093.19 | 30.57 | 242,07 (7) | 756 | |
xxh128 | 18802.16 | 32.37 | 234,30 (4) | 1012 | |
xxh128low | 18833.05 | 32.30 | 234,68 (3) | 1012 | |
t1ha2_atonce | 13854.44 | 37,92 | 233,54 (2) | 541 | Nullen niedrig3 |
t1ha2_atonce128 | 14148.42 | 55,70 | 253,74 (6) | 613 | Lange Nachbarn |
t1ha0_aes_noavx | 27231,59 | 37,70 | 236,10 (3) | 925 | LongNeighbors, maschinenspezifisch (x86 AES-NI) |
t1ha0_aes_avx1 | 22714,85 | 48.12 | 226,52 (16) | 843 | LongNeighbors, maschinenspezifisch (x64 AVX.txt) |
t1ha0_aes_avx2 | 56919.46 | 36,70 | 233,14 (2) | 792 | LongNeighbors, maschinenspezifisch (x64 AVX2) |
wyhash32 | 2532,89 | 48,40 | 484,57 (1) | 426 | 4 schlechte und kaputte Samen, 32-Bit |
wyhash32low | 22393,77 | 29.04 | 243,40 (3) | 474 | 5 schlechte Samen |
wyhash | 22540.23 | 28.87 | 236,16 (8) | 474 | |
Rapidhash | 23789,79 | 22,80 | 138,71 (7) | 574 | |
rapidhash_unrolled | 23892,88 | 23.41 | 139,47 (12) | 782 | |
umash32 | 21427.57 | 42.12 | 255,55 (5) | 1530 | |
umash32_hi | 21483.12 | 42,65 | 251,09 (4) | 1530 | |
umash64 | 21690.08 | 41,67 | 238,01 (4) | 1530 | |
umash128 | 13211,88 | 43,37 | 237,40 (3) | 1530 | |
halftime_hash64 | 4735,63 | 99,90 | 315,34 (3) | 2911 | |
halftime_hash128 | 17534.53 | 97,97 | 311.10 (4) | 2462 | |
halftime_hash256 | 18003.39 | 99,46 | 315,09 (3) | 2622 | |
halftime_hash512 | 10890.15 | 118.05 | 333,45 (3) | 3550 | |
nmhash32 | 12969,62 | 55,88 | 265,69 (4) | 2445 | |
nmhash32x | 12775.08 | 42,66 | 246,05 (3) | 1494 | |
k-hashv32 | 9181,87 | 52,76 | 245,14 (3) | 1280 | |
k-hashv64 | 7850.92 | 46,94 | 193,94 (1) | 1279 | |
Komihash | 12242,78 | 33.02 | 236,07 (2) | 1323 | |
polymur | 9676.33 | 42,70 | 246,53 (3) | 1128 |
Die sortierbaren Tischvarianten:
Standardmäßig AMD Ryzen 5 3350G 3,6 GHz
Intel i5-2300 2,8 GHz
Intel i5-2300 2,8 GHz 32 Bit
AMD Ryzen 3 3200U 3,5 GHz
Mac Air i7-4650
Cortex-A53 2GHz (Sony XPeria L4)
Ich habe einige SSE-unterstützte Hashes und schnelle Intel/Arm CRC32-C-, AES- und SHA-HW-Varianten hinzugefügt. Siehe auch den alten https://github.com/aappleby/smhasher/wiki, den verbesserten, aber nicht gewarteten Fork https://github.com/demerphq/smhasher und die neue verbesserte Version SMHasher3 https://gitlab.com/ fwojcik/smhasher3.
Die schnellsten Hash-Funktionen auf x86_64 ohne Qualitätsprobleme sind also:
Rapidhash (ein verbesserter Wyhash)
xxh3low
wyhash
umash (sogar universell!)
ahash64
t1ha2_atonce
Komihash
FarmHash ( nicht portierbar, zu maschinenspezifisch: 64 vs. 32 Bit, altes GCC, ... )
halftime_hash128
Gruselig32
pengyhash
nmhash32
mx3
MUM/mir ( unterschiedliche Ergebnisse auf 32/64-Bit-Bögen, viele fehlerhafte Seeds zum Herausfiltern )
fasthash32
Hash-Funktionen für Symboltabellen oder Hash-Tabellen verwenden typischerweise 32-Bit-Hashes, für Datenbanken, Dateisysteme und Dateiprüfsummen typischerweise 64 oder 128 Bit, für Krypto jetzt beginnend mit 256 Bit.
Die typische mittlere Schlüsselgröße in Perl5 beträgt 20, am häufigsten 4. Ähnliches gilt für alle anderen dynamischen Sprachen. Siehe github.com/rurban/perl-hash-stats
Bei Verwendung in einer Hash-Tabelle übertrifft der Befehlscache normalerweise die hier gemessene CPU und den Durchsatz. In meinen Tests schlägt der kleinste FNV1A
den schnellsten crc32_hw1
mit Perl 5-Hash-Tabellen. Auch wenn diese schlechteren Hash-Funktionen zu mehr Kollisionen führen, übertrifft der Gesamtgeschwindigkeitsvorteil und die Inline-Fähigkeit die etwas schlechtere Qualität. Siehe z. B. „A Seven-Dimensional Analysis of Hashing Methods and its Implications on Query Processing“ für einen kurzen Überblick über die besten Hash-Tabellen-Strategien, der bestätigt, dass das einfachste Mult-Hashing (bernstein, FNV*, x17, sdbm) immer „bessere“ Hash-Funktionen übertrifft (Tabulation, Murmur, Farm, ...) bei Verwendung in einer Hash-Tabelle.
Die hier getesteten schnellen Hash-Funktionen sind für Datei-Digests und möglicherweise größere Datenbanken empfehlenswert, nicht jedoch für 32-Bit-Hash-Tabellen. Die „Qualitätsprobleme“ führen zu einer weniger gleichmäßigen Verteilung, d. h. zu mehr Kollisionen und schlechterer Leistung, stehen aber selten im Zusammenhang mit echten Sicherheitsangriffen, sondern lediglich der 2. Sanity-AppendZeroes-Test gegen �
ist sicherheitsrelevant.
MiB/s: Der Durchschnitt des Massenschlüsselgeschwindigkeitstests für die Ausrichtungen 0–7 mit 262144-Byte-Schlüsseln. Je höher, desto besser.
zykl./hash: Der Durchschnitt des Small-Key-Geschwindigkeitstests für 1-31-Byte-Schlüssel. Je kleiner desto besser.
cycl./map: Das Ergebnis des Hashmap-Tests für /usr/dict/words mit schnellen C++-Hashmap-Get-Abfragen, mit der Standardabweichung in Klammern. Dies testet die Inlinabilität der Hash-Funktion in der Praxis (siehe Größe). Je kleiner desto besser.
Größe: Die Objektgröße in Byte auf AMD64. Dies wirkt sich auf die Inlinierbarkeit in z. B. Hash-Tabellen aus. Je kleiner desto besser.
Qualitätsprobleme: Sehen Sie sich die Fehler im verlinkten Dokument an. Je weniger, desto besser.
https://github.com/martinus/better-faster-stronger-mixer Mixer. Und in seinem Blog die besten C++-Hashmap-Benchmarks.
http://nohatcoder.dk/2019-05-19-1.html bietet eine neue, nützliche Hash-Level-Klassifizierung 1-5.
http://www.strchr.com/hash_functions listet weitere Benchmarks und die Qualität der einfachsten und schnellsten Hash-Funktionen auf.
http://bench.cr.yp.to/primitives-hash.html listet die Benchmarks aller aktuell getesteten sicheren Hashes auf.
http://valerieaurora.org/hash.html Lebensdauer kryptografischer Hash-Funktionen
Die in SipHash gegen City, Murmur oder Perl JenkinsOAAT oder bei Hash Function Lounge beschriebenen Hash-Table-Angriffe sind hier nicht enthalten. Einige bekannte Angriffe listen wir unter GH #186 auf.
Eine solche Angriffsvermeidung kann nicht das Problem der Hash-Funktion sein, sondern nur des Hash-Tabellen-Kollisionsauflösungsschemas. Sie können jede einzelne Hash-Funktion angreifen, selbst die beste und sicherste, wenn Sie den Seed erkennen, z. B. anhand von (Fehl-)Funktionen der Sprache, Seitenkanalangriffen, Kollisionszeitpunkten und unabhängig von der Sortierreihenfolge. Daher müssen Sie Ihre Kollision schützen Behandlungsschema aus dem Worst-Case-O(n), also separate Verkettung mit verketteten Listen. Die Verkettung verknüpfter Listen ermöglicht hohe Auslastungsfaktoren, ist jedoch sehr Cache-unfreundlich. Das einzig empfehlenswerte Schema für verknüpfte Listen ist das Inlining des Schlüssels oder Hashs in das Array. Heutzutage verwendet jeder schnelle offene Adressierung, auch wenn der Auslastungsfaktor ~50 % betragen muss, es sei denn, Sie verwenden Cuckoo Hashing.
Dh die Verwendung von SipHash für ihre Hash-Tabelle in Python 3.4, Ruby, Rust, Systemd, OpenDNS, Haskell und OpenBSD ist reine Sicherheitslücke. SipHash ist aus Sicherheitsgründen nicht sicher genug und für den allgemeinen Gebrauch nicht schnell genug. Die Brute-Force-Generierung von ca. 32.000 Kollisionen benötigt für alle diese Hashes 2–4 Minuten. Siphash ist der langsamste und benötigt maximal 4 m, andere normalerweise maximal 2 Minuten und 30 Sekunden, mit <10 Sekunden für praktische 16.000-Kollisionsangriffe mit allen Hash-Funktionen. Die Verwendung von Murmur ist selbst im schlimmsten Fall normalerweise langsamer als ein einfacher Mult. Beweisbar sicher ist nur einheitliches Hashing, d. h. 2–5 unabhängige Mult- oder Tabellierungsvorgänge, oder die Verwendung eines garantierten logarithmischen Kollisionsschemas (eines Baums) oder eines linearen Kollisionsschemas, wie z. B. swisstable/folly-F14, Robin Hood oder Cuckoo-Hashing mit Kollisionszählung.
Noch ein Hinweis zur Sicherheit: Heutzutage kann sogar SHA1 in einem Solver wie Z3 (oder schnelleren) für praktische Hash-Tabellen-Kollisionsangriffe (dh 14-20 Bit) gelöst werden. Alle hier getesteten Hash-Funktionen mit weniger als 160 Bit können überhaupt nicht als „sicher“ angesehen werden.
Der „�“-Schwachstellenangriff mit Binärschlüsseln wird im 2. Sanity Zero-Test getestet.
Unsere Krypto-Hashes werden mit einem hinzugefügten size_t-Seed gehärtet, der in den Anfangszustand gemischt wird, und die Versionen, die eine Nullauffüllung erfordern, werden auch durch Hinzufügen der Len gehärtet, um Kollisionen mit AppendedZeroes für die Auffüllung zu verhindern. Die libtomcrypt-Implementierungen sehen dies bereits vor, andere jedoch möglicherweise nicht. Ohne sie sind solche Krypto-Hash-Funktionen für normale Aufgaben ungeeignet, da es trivial ist, durch Padding oder fehlerhafte Seeds Kollisionen zu erzeugen.
Die offizielle NIST-Hash-Funktions-Testsuite führt keine so umfangreichen statistischen Tests durch, um nach schwachen Bereichen in den Bits zu suchen. Auch Krypto ändert den Ausgangszustand nicht, was wir hier für unseren zufälligen 32-Bit-Seed tun. Krypto kümmert sich hauptsächlich um nicht umkehrbare Schlüssel -> Hash-Funktionen, ohne den anfänglichen festen Zustand und Timings/Seitenkanalangriffe zu ändern.
Das NIST „Cryptographic Algorithm Validation Program“ (CAVP) umfasst das Testen der Implementierungen von FIPS-zugelassenen und NIST-empfohlenen kryptografischen Algorithmen. Während des NIST SHA-3-Wettbewerbs wurde die Testmethodik vom „CAVP“ übernommen, da die KATs und MCTs der SHA-3 Competition Test Suite auf den CAVP-Tests für SHA-2 basierten. Darüber hinaus erforderte der „Extremely Long Message Test“, der im CAVP für SHA-2 nicht vorhanden ist, von den Einsendern, dass sie den Hash-Wert generieren, der einer Nachricht mit einer Länge von 1 GiB entspricht. „NIST – Cryptographic Algorithm Validation Program (CAVP)“, Juni 2017. Verfügbar: http://csrc.nist.gov/groups/STM/cavp (Kein Testquellcode bereitgestellt, nur allgemeine Beschreibungen)
Zwei weitere unabhängige Testsuiten von Drittanbietern fanden zahlreiche Fehler und Schwachstellen in den SHA3-Kandidaten. „Finding Bugs in Cryptographic Hash Function Implementations“, Nicky Mouha, Mohammad S. Raunak, D. Richard Kuhn und Raghu Kacker, 2017. https://eprint.iacr.org/2017/891.pdf
Vielleicht sollten unabhängige Forscher zusammenkommen, um eine bessere öffentliche SHA-4-Runde durchzuführen, die auf besseren und mehr Testmethoden, offenem Quellcode für die Tests und der Verwendung von Standardpraktiken der Branche wie Valgrind, Address-Sanitizer und Ubsan basiert, um offensichtliche Fehler zu erkennen .
Schlechte Samen
Hash-Funktionen werden normalerweise mit einem zufälligen Startwert initialisiert. Einige Startwerte können jedoch unabhängig vom Schlüssel zu fehlerhaften Hash-Funktionen führen. Im regulären Fall mit zufälligen Samen ist die Wahrscheinlichkeit solcher schlechten Samen sehr gering, wie 2^32 oder 2^64. Eine praktische Anwendung muss wissen, ob schlechte Samen vorhanden sind, und einen anderen auswählen. Siehe zB mirhash_seed_init()
und mirhash_bad_seeds()
in Hashes.h
. Beachten Sie, dass ein fehlerhafter Seed kein wirkliches Problem darstellt, wenn Sie diesen Seed während der Initialisierung überspringen. Es kann immer noch eine GUTE oder empfohlene Hash-Funktion sein. Aber ein fehlerhafter Startwert von 0
, der zu Kollisionen führt, wird als Fehler betrachtet, als fehlerhafte Hash-Funktion.
Wir testen auf interne Geheimnisse, ob diese mit 0 multipliziert werden. Dies wird auch als „blinde Multiplikation“ bezeichnet. main.cpp
listet einige Geheimnisse für jede Hash-Funktion auf, gegen die wir testen. Die Funktion <hash>_bad_seeds()
listet die bestätigten fehlerhaften Seeds auf.
Besondere Vorsicht ist bei CRC, den meisten FNV1-Varianten, Fletcher und Jenkins geboten. Und mit GOOD Hashes die meisten MUM-Varianten, wie Mirhash, MUM, Wyhash.
Unabhängig davon führt die Kenntnis des Seeds durch den Angreifer zu DDOS-Angriffen. Sogar mit Krypto-Hashes in Power2-Hashtabellen.
Typische Probleme mit undefiniertem Verhalten ( UB ):
Falsch ausgerichtet
Viele wortweise Hashes (im Gegensatz zur sicheren byteweisen Verarbeitung) überprüfen den Eingabepuffer nicht auf korrekte Wortausrichtung, was bei ubsan oder Sparc fehlschlägt. Wort ist int32_t
oder int64_t
oder sogar mehr. Auf mancher alter RISC-Hardware handelt es sich dabei um einen BUS-Fehler. Sie können Intel HW sogar einen solchen Busfehler generieren lassen, indem Sie ein CPU-Flag setzen. Aber im Allgemeinen ist die Verwendung falsch ausgerichteter Zugriffe in Ordnung.
Dies sind: mx3, Spooky, Mirhash ( aber nicht streng ), MUM, Fasthash, Murmur3*, Murmur2*, Metrohash* (alle außer cmetro*), Crap8, Beamsplitter, Lookup3, Fletcher4, Fletcher2, alle Sanmayce FNV1a_-Varianten (FNV1a_YT, FNV1A_Pippip_Yurii, FNV1A_Totenschiff, ...), Fibonacci.
Die übliche Abhilfe besteht darin, die Pufferausrichtung entweder im Aufrufer zu überprüfen, eine Vorverarbeitungsschleife für das falsch ausgerichtete Präfix bereitzustellen oder den gesamten Puffer in einen neu ausgerichteten Bereich zu kopieren. Fügen Sie diesen zusätzlichen Code in #ifdef HAVE_ALIGNED_ACCESS_REQUIRED
ein.
oob – Außerhalb der Grenzen
Einige Hash-Funktionen gehen von einem aufgefüllten Eingabepuffer aus, auf den über seine Länge hinaus bis zur Wortgröße zugegriffen werden kann. Dies ermöglicht eine schnellere Schleifenverarbeitung, da für den Rest keine zweite Schleife oder Switch-Tabelle erforderlich ist, erfordert jedoch eine kooperative Aufrufumgebung und wird daher als Betrug betrachtet.
Vorzeichenbehafteter Ganzzahlüberlauf
Da es sich um einen einfachen Typfehler handelt, muss dieser Hash intern ganzzahlige Typen ohne Vorzeichen verwenden, um undefiniertes und inkonsistentes Verhalten zu vermeiden. dh SuperFastHash: vorzeichenbehafteter Ganzzahlüberlauf: -2147483641 + -113 kann nicht im Typ „int“ dargestellt werden
Überlauf des Verschiebungsexponenten
Mit: FNV1A_Pippip_Yurii, FNV1A_Totenschiff,pair_multiply_shift, sumhash32 Verschiebungsexponent 64 ist zu groß für den 64-Bit-Typ „long unsigned int“