Хэш-функция | МиБ/сек | цикл./хеш | цикл./карта | размер | Проблемы с качеством |
---|---|---|---|---|---|
ничего не делать32 | 11149460.06 | 4.00 | - | 13 | плохое начальное значение 0, проверка NOP |
ничего не делать64 | 11787676.42 | 4.00 | - | 13 | плохое начальное значение 0, проверка NOP |
ничего не делать128 | 11745060.76 | 4.06 | - | 13 | плохое начальное значение 0, проверка NOP |
NOP_OAAT_read64 | 11372846.37 | 14.00 | - | 47 | проверить НОП |
БадХэш | 769,94 | 73,97 | - | 47 | плохое начальное значение 0, тест FAIL |
сумхаш | 10699,57 | 29.53 | - | 363 | плохое начальное значение 0, тест FAIL |
сумхэш32 | 42877,79 | 23.12 | - | 863 | UB, тест НЕ ПРОЙДЕН |
Multiple_shift | 8026,77 | 26.05 | 226,80 (8) | 345 | плохие семена и 0xffffff0, не проходит большинство тестов |
пара_multiply_shift | 3716,95 | 40.22 | 186,34 (3) | 609 | не проходит большинство тестов |
-------------------------- | |||||
crc32 | 383,12 | 134,21 | 257,50 (11) | 422 | небезопасно, 8590x коллизий, распределение, PerlinNoise |
md5_32 | 350,53 | 644,31 | 894,12 (10) | 4419 | |
md5_64 | 351.01 | 656,67 | 897,43 (12) | 4419 | |
мд5-128 | 350,89 | 681,88 | 894,03 (13) | 4419 | |
sha1_32 | 353.03 | 1385,80 | 1759,94 (5) | 5126 | Вменяемость, циклический низкий32, распределение 36,6%. |
sha1_64 | 353.03 | 1385,80 | 1759,94 (5) | 5126 | Вменяемость, циклический низкий32, распределение 36,6%. |
ша1-160 | 364,95 | 1470,55 | 1794,16 (13) | 5126 | Гребень/циклический low32 |
ша2-224 | 147,13 | 1354,81 | 1589,92 (12) | Гребень низкий32 | |
sha2-224_64 | 147,60 | 1360,10 | 1620,93 (13) | Циклический минимум32 | |
ша2-256 | 147,80 | 1374,90 | 1606,06 (16) | ||
sha2-256_64 | 148.01 | 1376,34 | 1624,71 (16) | ||
ша1ни | 1601,21 | 174,16 | 397,28 (6) | 989 | небезопасно, здравомыслие, перестановка, нули, зависит от машины |
sha1ni_32 | 1576,17 | 174.04 | 405,56 (6) | 989 | машиноспецифичный |
ша2ни-256 | 1527,38 | 184,35 | 404,40 (4) | 4241 | небезопасно, здравомыслие, перестановка, нули, зависит от машины |
sha2ni-256_64 | 1501,85 | 186,20 | 407,96 (5) | 4241 | Нули, зависят от машины |
blake3_c | 1288,84 | 357,69 | 582,89 (6) | нет 32-битной переносимости | |
rmd128 | 290,90 | 710,49 | 965,55 (6) | ||
rmd160 | 202.16 | 1045,79 | 1287,74 (16) | Циклический привет32 | |
rmd256 | 364,81 | 584,86 | 835,02 (11) | ||
edonr224 | 864,69 | 303,42 | 526,94 (6) | ||
edonr256 | 847,85 | 305,79 | 510.01 (4) | ||
Блейк2С-128 | 295.30 | 698,09 | 1059,24 (51) | ||
блейк2с-160 | 215.01 | 1026,74 | 1239,54 (11) | ||
Блейк2С-224 | 207.06 | 1063,86 | 1236,50 (20) | ||
Блейк2С-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 | |
ша3-256 | 100,58 | 3877,18 | 4159,79 (37) | ПерлинШум | |
sha3-256_64 | 100,57 | 3909,00 | 4174,63 (16) | ПерлинШум | |
хаше2 | 2773,89 | 64,35 | 282,30 (3) | 445 | Перестановка, два байта, нули, начальное число |
Poly_1_mersenne | 1369,21 | 61,59 | 248,86 (4) | 479 | не проходит большинство тестов |
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 | |
таблица32 | 5781,16 | 40.00 | 241,79 (10) | 848 | столкновения |
табуляция | 7875.01 | 39,95 | 249,49 (3) | 554 | |
crc32_hw | 6244,38 | 41,23 | 226,80 (2) | 653 | небезопасно, 100% смещение, коллизии, распределение, BIC, машинно-зависимый (SSE4.2/NEON) |
crc32_hw1 | 7569,29 | 49.07 | 233,75 (3) | 671 | небезопасно, 100% смещение, коллизии, распределение, BIC, машинно-зависимый (x86 SSE4.2) |
crc64_hw | 6143,62 | 40,48 | 223,13 (2) | 652 | небезопасно, 100% смещение, коллизии, распределение, BIC, машинно-зависимый (SSE4.2/NEON) |
crc32_pclmul | - | - | - | небезопасно, 100% смещение, коллизии, распределение, BIC, машинно-зависимый (x86 SSE4.2+PCLMUL) | |
o1хэш | 11629440.57 | 18.15 | 199,35 (2) | 101 | небезопасно, нет начального числа, нули, не проходит все тесты |
Фибоначчи | 16878,32 | 22.94 | 803,18 (15) | 1692 г. | UB, нули, не проходит все тесты |
ФНВ1а | 760,52 | 73,83 | 254,29 (5) | 204 | плохое начальное число, нули, не проходит все тесты |
FNV1A_Тотеншифф | 6274,78 | 26.23 | 251,13 (2) | 270 | UB, нули, не проходит все тесты |
FNV1A_Пиппип_Юрий | 6172.14 | 27.55 | 244,80 (2) | 147 | UB, здравомыслие, проваливает все тесты |
ФНВ1а_YT | 13486,49 | 30.50 | 237,43 (4) | 321 | плохое семя, UB, не проходит все тесты |
ФНВ2 | 6171,60 | 32.20 | 208,59 (4) | 278 | проваливает все тесты |
ФНВ64 | 774,37 | 72,43 | 201,15 (2) | 79 | проваливает все тесты |
ФНВ128 | 390,14 | 136,42 | 289,00 (3) | 171 | проваливает все тесты |
k-хеш32 | 2230.42 | 53.05 | 264,64 (3) | 808 | небезопасно, нули, UB, плохие семена, не проходит все тесты |
k-хеш64 | 2451,88 | 48,66 | 249,44 (2) | 609 | небезопасно, нули, UB, плохие семена, не проходит все тесты |
Флетчер2 | 15552,61 | 20.61 | 335,31 (3) | 248 | плохое начальное число 0, UB, не проходит все тесты |
Флетчер4 | 15556,93 | 20.60 | 358,60 (3) | 371 | плохое начальное число 0, UB, не проходит все тесты |
Бернштейн | 1045,97 | 58.31 | 225,78 (3) | 41 | плохое начальное число 0, проваливает все тесты |
СДБМ | 784,83 | 68,57 | 222,68 (5) | 41 | плохое начальное число 0, проваливает все тесты |
х17 | 748,75 | 74.13 | 236.00 (10) | 79 | Ошибка 99,98%, не проходит все тесты |
свобода | 628,66 | 84,95 | 225,07 (4) | 37 | небезопасно, 100% предвзятость, не проходит все тесты, плохое начальное число |
GCC | 611,69 | 86,47 | 231,51 (5) | 39 | небезопасно, 100% предвзятость, не проходит все тесты, плохое начальное число |
ДженкинсООАТ | 627,64 | 107.04 | 252,79 (3) | 153 | плохое начальное число 0, погрешность 53,5%, не проходит все тесты |
ДженкинсOOAT_perl | 608.10 | 94,17 | 254,09 (4) | 65 | плохое начальное число 0, смещение 1,5–11,5%, коллизии 7,2x, BIC, LongNeighbors |
МикроОААТ | 701,35 | 76,68 | 251,01 (3) | 68 | 100% смещение, распределение, BIC |
Пирсонхэш64 | 434,17 | 124,14 | 230,79 (4) | Avalanche, Seed, только SSSE3. сломанный MSVC | |
Пирсонхэш128 | 434,23 | 121,34 | 221,03 (7) | Avalanche, Seed, только SSSE3. сломанный MSVC | |
Пирсонхэш256 | 444,08 | 119,11 | 229,75 (4) | Avalanche, Seed, только SSSE3. сломанный MSVC | |
ВХАШ_32 | 13053.40 | 65,84 | 289,86 (3) | 1231 | здравомыслие, Семя, МоментЧи2 |
ВХАШ_64 | 13465,50 | 63,88 | 286,38 (5) | 1231 | здравомыслие, Семя, Редкий |
фарш32 | 27038.23 | 66,88 | 278,89 (5) | 944 | небезопасно: AppendedZeroes, коллизии+смещение, MomentChi2, LongNeighbors |
фарш64 | 13829,32 | 112,46 | 332,59 (3) | 944 | небезопасно: AppendedZeroes, коллизии+смещение, MomentChi2, LongNeighbors |
фарш128 | 6878,88 | 233,35 | 384,85 (3) | 944 | небезопасно: AppendedZeroes, коллизии+смещение, перестановка, объединение, 2 байта, нули, PerlinNoise |
фарш256 | 3467,37 | 440,40 | 593,57 (5) | 944 | небезопасно: AppendedZeroes, коллизии+смещение, перестановка, объединение, 2 байта, нули, PerlinNoise |
Джодихэш32 | 1794,34 | 41.12 | 235,12 (4) | 102 | смещение, коллизии, расхождение, BIC LongNeighbors |
Джодихэш64 | 4813,10 | 40,72 | 239,22 (6) | 118 | смещение, коллизии, distr, BIC, LongNeighbors |
поиск3 | 2475,35 | 39,65 | 240,10 (3) | 341 | UB, смещение 28 %, коллизии, расхождение 30 %, BIC |
сверхбыстрый | 2058.22 | 49,56 | 254,12 (3) | 210 | UB, плохое начальное число 0, смещение 91%, коллизии 5273,01x, расхождение 37%, BIC |
РопотOAAT | 506,66 | 103,33 | 236,89 (3) | 47 | плохое начальное значение 0, коллизии, расхождение 99,998%, BIC, LongNeighbours |
Дерьмо8 | 3041.14 | 37,25 | 247,87 (4) | 342 | UB, смещение 2,42%, коллизии, распределение 2%. |
Шум1 | 2027.85 | 48,51 | 253,34 (3) | 358 | UB, 1 неудачное семя, 511 коллизий, Diff, BIC |
Ропот2 | 3089.18 | 41,22 | 238,42 (4) | 358 | UB, 1 плохой посев, смещение 1,7%, 81x кол, 1,7% распределение, BIC |
Мурмур2А | 3087,98 | 45,90 | 238,54 (4) | 407 | UB, 1 неудачное семя, смещение 12,7%, LongNeighbors |
Шум2Б | 5919,38 | 38.18 | 215,96 (3) | 433 | UB, смещение 1,8%, коллизии, распределение 3,4%, BIC |
Мурмур2C | 3810,98 | 49.09 | 218,51 (3) | 444 | UB, 2^32 плохих начальных числа, смещение 91%, коллизии, distr, BIC, LongNeighbors |
Шум3А | 2982,67 | 49.08 | 245,78 (4) | 351 | УБ, 1 плохая посевная, Момент Чи2 69 |
PMurHash32 | 3005.85 | 48,88 | 242,38 (3) | 1862 г. | 1 неудачное семя, Момент Чи2 69 |
Мурмур3C | 4833,18 | 56,87 | 250,47 (6) | 859 | UB, LongNeighbors, Текст, DiffDist |
мирхэш32low | 6145,39 | 36,95 | 235,09 (4) | 1112 | UB, 4 плохих семени, Cyclic, LongNeighbors, для конкретной машины (отличается 32/64) |
ПМПМЛ_32 | 6639,68 | 45,33 | 257,45 (3) | 1084 | Avalanche >512, без посева: Seed, BIC, MomentChi2, PerlinNoise |
ПМПМЛ_64 | 9833,77 | 50.00 | 251,64 (6) | 1305 | без посева: Seed, MomentChi2, BIC |
ххХэш32 | 5865,17 | 49.20 | 242,74 (3) | 738 | LongNeighbors, коллизии с 4-битным дифференциалом, MomentChi2 220 |
метрохэш64 | 14741,56 | 39,44 | 215,76 (2) | 624 | УБ, ЛонгНейборс, БИК |
метрохэш64_1 | 14298,77 | 40.31 | 223,25 (4) | 624 | УБ, ЛонгНейборс, БИК, МоментЧи2 |
метрохэш64crc_1 | 6929,69 | 44,65 | 223,68 (3) | 632 | UB, циклический 8/8 байт, DiffDist, BIC, MomentChi2, машинно-зависимый (SSE4.2/NEON) |
метрохэш64crc_2 | 8150,65 | 43,72 | 219,45 (5) | 632 | UB, циклический 8/8 байт, DiffDist, BIC, машинно-зависимый (SSE4.2/NEON) |
cmetrohash64_1o | 14921,73 | 38,95 | 213,25 (2) | 3506 | УБ, ЛонгНейборс, БИК, МоментЧи2 |
cmetrohash64_1 | 14151,73 | 40,90 | 211,89 (2) | 652 | УБ, ЛонгНейборс, БИК, МоментЧи2 |
Город64noSeed | 14209.19 | 31.80 | 225,90 (5) | 1038 | Avalanche, Sparse, TwoBytes, MomentChi2, Seed |
Город64 | 13887,84 | 46,32 | 239,77 (3) | 1120 | Разреженный, два байта |
t1ha1_64le | 13442,64 | 31.41 | 219,58 (3) | 517 | лавина |
t1ha1_64be | 11586.02 | 32,74 | 232,55 (3) | 555 | лавина |
t1ha0_32le | 7401.21 | 48,27 | 238,99 (3) | 509 | Разреженный, Длинные Соседи |
t1ha0_32be | 6217,37 | 50,66 | 244,51 (3) | 533 | Разреженный, Длинные Соседи |
t1ha2_stream | 14011.63 | 80,72 | 275,17 (3) | 1665 г. | Разреженный, перестановка, LongNeighbours |
t1ha2_stream128 | 13136.06 | 97,80 | 306,11 (7) | 1665 г. | Разреженный, перестановка, LongNeighbours |
Эснихаш | 5579,32 | 56,83 | 258,71 (5) | 1209 | не проходит множество тестов, зависит от машины (x64 AES-NI) |
фальхаш | 50631,69 | 123.02 | 322,14 (7) | 264 | Разреженный, LongNeighbors, машинно-зависимый (x64 AES-NI) |
МяуХэш | 29969,40 | 64,96 | 274,29 (4) | 1764 г. | Разреженный, обратимый, машинозависимый (x64 AES-NI) |
МяуHash64low | 29485.59 | 65,98 | 278,05 (3) | 1764 г. | Разреженный, обратимый, машинозависимый (x64 AES-NI) |
MeowHash32low | 26944,58 | 65,95 | 292,79 (9) | 1764 г. | Разреженный, обратимый, машинозависимый (x64 AES-NI) |
-------------------------------------- | |||||
tifuhash_64 | 35,60 | 1679,52 | 1212,75 (15) | 276 | Циклический минимум32 |
флоппсихэш | 35,72 | 1868,92 | 1411,07 (7) | 623 | |
светоделитель | 789,22 | 682,45 | 1150,33 (26) | 4203 | УБ |
дискохэш1 | 4131.12 | 199,00 | 398,35 (5) | 1294 | |
дискохэш1-128 | 4072,95 | 234,17 | 438,43 (5) | 1294 | |
дискохэш2 | 3986,52 | 207,52 | 421,99 (2) | 1294 | |
дискохэш2-128 | 4094,73 | 236,61 | 433,35 (4) | 1294 | |
дискоНОНГ | 3698,45 | 399,67 | 597,78 (9) | плохие семена | |
Часки | 1143.05 | 113,70 | 294,43 (4) | 1609 г. | ПерлинШум |
СипХэш | 943,53 | 147,15 | 338,74 (4) | 1071 | |
HalfSipHash | 1141,57 | 79,65 | 263,96 (3) | 700 | нули |
ГудОААТ | 743,81 | 85,62 | 231,22 (3) | 237 | |
Пирсонбхэш64 | 1794,83 | 97,80 | 268,90 (8) | 683 | |
Пирсонбхэш128 | 1691,62 | 104,57 | 272,38 (4) | 1134 | |
Пирсонбхэш256 | 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 | |
СипХэш13 | 1812,75 | 106,56 | 310,76 (5) | 778 | смещение 0,9% |
ТСип | 4233,17 | 53.31 | 249,19 (3) | 519 | !мсвк |
морской хэш | 8261,80 | 58,94 | 256,08 (4) | 871 | PerlinNoise, !msvc |
Seahash32low | 8266,17 | 58,90 | 290,21 (16) | 871 | PerlinNoise 32, !msvc |
столкновение | 18703.04 | 70.19 | 282,12 (6) | 1809 г. | PerlinNoise, для конкретной машины (x64 SSE4.2) |
шоссеHash64 | 6242,58 | 99,55 | 248,41 (3) | 2546 | |
Шум3F | 7623,44 | 52,69 | 221,87 (3) | 699 | УБ |
МАМА | 9563,99 | 34,99 | 228,55 (5) | 1912 год | UB, слишком много плохих семян, зависит от машины (отличается 32/64) |
MUMlow | 9261,89 | 36.17 | 247,66 (4) | 1912 год | УБ, 5 плохих семян |
xmsx32 | 2039.10 | 46,39 | 249,30 (7) | 192 | 2 плохих семени |
Мирхаш | 6139.07 | 37.02 | 209,47 (3) | 1112 | UB, 2^36 плохих семян, LongNeighbors, зависит от машины (отличается 32/64) |
Мирхашстрик | 3549.01 | 49,99 | 224,91 (2) | 1112 | |
мирхэшстрик32low | 3441,35 | 50,60 | 247,19 (3) | 1112 | 1 неудачное семя, МоментЧи2 9 |
фастхэш32 | 6128,28 | 40.30 | 241,64 (4) | 566 | УБ |
фастхэш64 | 5818,92 | 38,70 | 220,74 (2) | 509 | УБ |
Эсни | 31232.34 | 29.21 | 230,14 (4) | 519 | машинно-зависимый (x64 AES-NI) |
эсни-лоу | 31221.14 | 29,64 | 226,18 (3) | 519 | машинно-зависимый (x64 AES-NI) |
мх3 | 9034,90 | 48,71 | 227,89 (2) | 734 | УБ |
пенгихэш | 13428,80 | 74,24 | 275,42 (5) | 421 | |
Город32 | 5551,28 | 54.40 | 261,64 (2) | 1319 | |
Город64low | 13904.10 | 46,24 | 260,08 (3) | 1120 | |
Город128 | 14031,96 | 89.09 | 290,05 (10) | 1841 г. | |
ГородCrc128 | 7916,44 | 55,50 | 240,79 (2) | 295 | |
ФермаХэш32 | 21755.58 | 47,54 | 258,35 (3) | 11489 | для конкретного компьютера (x64 SSE4/AVX) |
ФермаХэш64 | 12845,53 | 47.11 | 251,58 (3) | 3758 | |
ФермаХэш128 | 13913,65 | 70,25 | 263,06 (3) | 163 | |
Farmhash32_c | 21601.86 | 47,38 | 273,00 (3) | 762 | для конкретного компьютера (x64 SSE4/AVX) |
Farmhash64_c | 12834.10 | 47,23 | 246,20 (2) | 3688 | |
Farmhash128_c | 13753,24 | 68,96 | 263,76 (3) | 1890 г. | |
метрохэш64_2 | 14316,37 | 40.23 | 218,28 (3) | 627 | УБ, ЛонгНейборс |
cmetrohash64_2 | 14294,26 | 40,76 | 221,40 (4) | 655 | ЛонгНейборс |
метрохэш128 | 15634,66 | 73,28 | 261,23 (4) | 773 | УБ, ЛонгНейборс |
метрохэш128_1 | 15806,97 | 72.30 | 260,90 (4) | 773 | УБ, ЛонгНейборс |
метрохэш128_2 | 15822,60 | 72.30 | 255,34 (3) | 773 | УБ, ЛонгНейборс |
метрохэш128crc_1 | 8009.23 | 78,72 | 281,55 (13) | 723 | UB, в зависимости от машины (SSE4.2/NEON) |
метрохэш128crc_2 | 7878,22 | 79,90 | 275,22 (4) | 723 | UB, в зависимости от машины (SSE4.2/NEON) |
ххХэш64 | 12108.87 | 49,78 | 228,83 (2) | 1999 год | |
Жуткий32 | 13108.95 | 56,27 | 255,36 (3) | 2221 | УБ |
Spooky64 | 13529,36 | 58,76 | 236,31 (3) | 2221 | УБ |
Жуткий128 | 11781,35 | 58,91 | 242,91 (3) | 2221 | УБ |
ЖуткийV2_32 | 13529.16 | 55,55 | 248,37 (4) | 2069 | |
ЖуткийV2_64 | 12678,82 | 56,71 | 243,21 (4) | 2069 | |
ЖуткийV2_128 | 13512,82 | 58,33 | 244,56 (5) | 2069 | |
ахаш64 | 9862,62 | 27.32 | 181,68 (1) | 412 | ржавчина |
ххх3 | 21033.55 | 29.48 | 226,77 (4) | 744 | DiffDist бит 7 w. 36 бит, БИК |
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 | Нули низкие3 |
t1ha2_atonce128 | 14148.42 | 55,70 | 253,74 (6) | 613 | ЛонгНейборс |
t1ha0_aes_noavx | 27231,59 | 37,70 | 236,10 (3) | 925 | LongNeighbors, для конкретного компьютера (x86 AES-NI) |
t1ha0_aes_avx1 | 22714.85 | 48.12 | 226,52 (16) | 843 | LongNeighbors, для конкретного компьютера (x64 AVX.txt) |
t1ha0_aes_avx2 | 56919,46 | 36,70 | 233,14 (2) | 792 | LongNeighbors, для конкретного компьютера (x64 AVX2) |
wyhash32 | 2532,89 | 48.40 | 484,57 (1) | 426 | 4 плохих и битых сида, 32-битная версия |
wyhash32low | 22393,77 | 29.04 | 243,40 (3) | 474 | 5 плохих семян |
Уихаш | 22540.23 | 28.87 | 236,16 (8) | 474 | |
Рапидхеш | 23789,79 | 22.80 | 138,71 (7) | 574 | |
Rapidhash_unrolled | 23892,88 | 23.41 | 139,47 (12) | 782 | |
умаш32 | 21427.57 | 42.12 | 255,55 (5) | 15:30 | |
umash32_привет | 21483.12 | 42,65 | 251,09 (4) | 15:30 | |
умаш64 | 21690.08 | 41,67 | 238,01 (4) | 15:30 | |
умаш128 | 13211,88 | 43,37 | 237,40 (3) | 15:30 | |
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 | |
нмхэш32 | 12969,62 | 55,88 | 265,69 (4) | 2445 | |
нмхэш32x | 12775.08 | 42,66 | 246,05 (3) | 1494 | |
к-хэшv32 | 9181,87 | 52,76 | 245,14 (3) | 1280 | |
k-hashv64 | 7850,92 | 46,94 | 193,94 (1) | 1279 | |
комихаш | 12242,78 | 33.02 | 236,07 (2) | 1323 | |
полимур | 9676,33 | 42,70 | 246,53 (3) | 1128 |
Варианты сортируемой таблицы:
AMD Ryzen 5 3350G по умолчанию, 3,6 ГГц
Intel i5-2300 2,8 ГГц
Intel i5-2300 2,8 ГГц 32 бита
AMD Ryzen 3 3200U 3,5 ГГц
Мак Эйр i7-4650
Cortex-A53 2 ГГц (Sony XPeria L4)
Я добавил несколько хэшей с поддержкой SSE и быстрые варианты Intel/Arm CRC32-C, AES и SHA HW. См. также старую https://github.com/aappleby/smhasher/wiki, улучшенную, но не поддерживаемую вилку https://github.com/demerphq/smhasher и новую улучшенную версию SMHasher3 https://gitlab.com/. fwojcik/smhasher3.
Итак, самые быстрые хеш-функции на x86_64 без проблем с качеством:
Rapidhash (улучшенный wyhash)
xxh3low
Уихаш
умаш (даже универсальный!)
ахаш64
t1ha2_atonce
комихаш
FarmHash ( не переносимый, слишком специфичный для машины: 64 против 32 бит, старый gcc,... )
halftime_hash128
Жуткий32
пенгихэш
нмхэш32
мх3
MUM/mir ( разные результаты на 32/64-битных версиях, много плохих сидов, которые нужно отфильтровать )
фастхэш32
Хэш-функции для таблиц символов или хеш-таблиц обычно используют 32-битные хэши, для баз данных, файловых систем и контрольных сумм файлов обычно 64 или 128 бит, а для шифрования теперь начинаются с 256 бит.
Типичный средний размер ключа в Perl5 составляет 20, наиболее распространенный — 4. Аналогично для всех других динамических языков. См. github.com/rurban/perl-hash-stats.
При использовании в хеш-таблице кэш инструкций обычно превосходит процессор и измеренную здесь пропускную способность. В моих тестах самый маленький FNV1A
превосходит самый быстрый crc32_hw1
с хеш-таблицами Perl 5. Даже если эти худшие хэш-функции приведут к большему количеству коллизий, общее преимущество в скорости и встроенных возможностях превосходит немного худшее качество. См., например, «Семимерный анализ методов хеширования и его влияние на обработку запросов», где приводится краткий обзор лучших стратегий хеш-таблиц, подтверждающий, что простейшее многомерное хеширование (bernstein, FNV*, x17, sdbm) всегда превосходит «лучшие» хеш-функции. (Табуляция, Мурмур, Ферма, ...) при использовании в хеш-таблице.
Протестированные здесь быстрые хеш-функции рекомендуются как быстрые для дайджестов файлов и, возможно, для более крупных баз данных, но не для 32-битных хэш-таблиц. «Проблемы качества» приводят к менее равномерному распределению, то есть к большему количеству коллизий и худшей производительности, но редко связаны с реальными атаками на безопасность, только второй тест AppendZeroes на здравомыслие против �
имеет значение для безопасности.
МиБ/сек: среднее значение теста скорости группового ключа для выравниваний 0–7 с ключами длиной 262 144 байта. Чем выше, тем лучше.
цикл./хэш: среднее значение теста скорости малого ключа для ключей длиной от 1 до 31 байта. Чем меньше, тем лучше.
cycl./map: результат теста Hashmap для /usr/dict/words с быстрыми запросами на получение хеш-карт C++ со стандартным отклонением в скобках. Это проверяет возможность встраивания хэш-функции на практике (см. размер). Чем меньше, тем лучше.
размер: размер объекта в байтах на AMD64. Это влияет на возможность встраивания, например, в хэш-таблицы. Чем меньше, тем лучше.
Проблемы с качеством: см. ошибки в связанном документе. Чем меньше, тем лучше.
https://github.com/martinus/better-faster-stronger-mixer Микшеры. А в его блоге — лучшие тесты хэш-карт C++.
http://nohatcoder.dk/2019-05-19-1.html предоставляет новую, полезную классификацию уровней хеширования 1–5.
http://www.strchr.com/hash_functions перечисляет другие тесты и качество наиболее простых и быстрых хеш-функций.
http://bench.cr.yp.to/primitives-hash.html перечисляет тесты всех проверенных в настоящее время безопасных хэшей.
http://valerieaurora.org/hash.html Время жизни криптографических хэш-функций
Атаки хеш-таблиц, описанные в SipHash против City, Murmur или Perl JenkinsOAAT или в Hash Function Lounge, сюда не включены. Мы перечисляем некоторые известные атаки на GH #186.
Такое предотвращение атак не может быть проблемой хеш-функции, а только схемы разрешения коллизий хеш-таблиц. Вы можете атаковать каждую хеш-функцию, даже самую лучшую и безопасную, если вы обнаружите начальное число, например, с помощью (неправильных) функций языка, атак по побочным каналам, времени коллизий и независимо от порядка сортировки, поэтому вам необходимо защитить свою коллизию. схема обработки из худшего случая O(n), т.е. отдельная цепочка со связанными списками. Цепочка связанных списков допускает высокие коэффициенты нагрузки, но очень недружелюбна к кэшу. Единственная рекомендуемая схема связанного списка — это встраивание ключа или хеша в массив. Сейчас все используют быструю открытую адресацию, даже если коэффициент загрузки должен составлять ~50%, если только вы не используете Cuckoo Hashing.
Т.е. использование SipHash для их хэш-таблиц в Python 3.4, Ruby, Rust, Systemd, OpenDNS, Haskell и OpenBSD — это чистый театр безопасности. SipHash недостаточно безопасен в целях безопасности и недостаточно быстр для общего использования. Для грубой генерации ~32 тысяч коллизий требуется 2-4 миллиона для всех этих хэшей. siphash, являющийся самым медленным, требует максимум 4 миллиарда, для других обычно максимум 2 минуты 30 секунд, причем <10 секунд для практических атак на коллизии 16 000 со всеми хеш-функциями. Использование Murmur обычно медленнее, чем простой Mult, даже в худшем случае. Доказуемая безопасность - это только равномерное хеширование, т.е. 2-5 независимых Mult или Tabulation, или использование гарантированной логарифмической схемы коллизий (дерева) или линейной схемы коллизий, такой как swisstable/folly-F14, Робин Гуд или хеширование Cuckoo с подсчетом коллизий.
Еще одно замечание относительно безопасности: в настоящее время даже SHA1 можно решить в решателе, таком как Z3 (или более быстром), для практических атак на столкновение хеш-таблиц (т. е. 14-20 бит). Все протестированные здесь хэш-функции с длиной менее 160 бит вообще не могут считаться «безопасными».
Атака уязвимости «��» с использованием двоичных ключей проверена во 2-м тесте Sanity Zero.
Наши крипто-хеши усилены добавлением начального числа size_t, смешанного с исходным состоянием, а версии, требующие заполнения нулями, усилены также добавлением len, чтобы предотвратить конфликты с AppendedZeroes для заполнения. Реализации libtomcrypt уже предусматривают это, но другие могут этого не делать. Без этого такие крипто-хэш-функции непригодны для обычных задач, так как легко создать коллизии путем заполнения или плохих начальных значений.
Официальный набор тестов хеш-функций NIST не проводит таких обширных статистических тестов для поиска слабых диапазонов в битах. Кроме того, криптография не меняет начальное состояние, что мы делаем здесь для нашего случайного 32-битного начального значения. Crypto в основном заботится о необратимых ключах -> хэш-функциях без изменения исходного фиксированного состояния и таймингов/атак по побочным каналам.
«Программа проверки криптографических алгоритмов» (CAVP) NIST включает тестирование реализаций криптографических алгоритмов, одобренных FIPS и рекомендованных NIST. Во время конкурса NIST SHA-3 методология тестирования была заимствована из «CAVP», поскольку KAT и MCT комплекта конкурсных тестов SHA-3 были основаны на тестах CAVP для SHA-2. В дополнение к этому «Тест чрезвычайно длинных сообщений», отсутствующий в CAVP для SHA-2, требовал от отправителей сгенерировать хеш-значение, соответствующее сообщению длиной 1 ГиБ. «NIST — Программа проверки криптографических алгоритмов (CAVP)», июнь 2017 г. Доступно: http://csrc.nist.gov/groups/STM/cavp (Исходный код тестирования не предоставлен, только высокоуровневые описания)
Два других независимых сторонних набора тестов обнаружили большое количество ошибок и слабых мест в кандидатах SHA3. «Обнаружение ошибок в реализации криптографических хэш-функций», Ники Моуха, Мохаммад С. Раунак, Д. Ричард Кун и Рагу Какер, 2017. https://eprint.iacr.org/2017/891.pdf
Возможно, независимым исследователям следует объединиться, чтобы провести более качественный общедоступный раунд SHA-4, основанный на более совершенных и дополнительных методах тестирования, открытом исходном коде для тестов и использовании стандартных отраслевых практик, таких как valgrind, адрес-санитайзер и ubsan, для обнаружения очевидных ошибок. .
Плохие семена
Хэш-функции обычно инициализируются случайным начальным числом. Но некоторые начальные значения могут привести к неверным хеш-функциям независимо от ключа. В обычном случае со случайными семенами вероятность появления таких плохих семян очень мала, например 2^32 или 2^64. Практическое приложение должно знать, существуют ли плохие семена, и выбирать другое. См., например, mirhash_seed_init()
и mirhash_bad_seeds()
в Hashes.h
. Обратите внимание, что плохое начальное значение на самом деле не является проблемой, если вы пропустите его во время инициализации. Это все равно может быть ХОРОШАЯ или рекомендуемая хэш-функция. Но неправильное начальное значение 0
, приводящее к коллизиям, считается ошибкой, плохой хэш-функцией.
Мы проверяем внутренние секреты, будут ли они умножены на 0. Это также называется «слепым умножением». main.cpp
перечислены некоторые секреты для каждой хэш-функции, которую мы тестируем. Функция <hash>_bad_seeds()
перечисляет подтвержденные плохие семена.
Особое внимание необходимо уделять crc, большинству вариантов FNV1, Fletcher, Jenkins. И с ХОРОШИМИ хэшами большинство вариантов MUM, таких как mirhash, MUM, wyhash.
Независимо от этого, когда злоумышленник узнает начальное значение, это приведет к DDOS-атакам. Даже с крипто-хешами в хэш-таблицах power2.
Типичные проблемы неопределенного поведения ( UB ):
не выровнено
Многие пословные хэши (в отличие от безопасной побайтовой обработки) не проверяют входной буфер на правильность выравнивания слов, что не удастся при использовании ubsan или Sparc. слово — int32_t
или int64_t
или даже больше. На некоторых старых RISC-оборудованиях это будет ошибка шины. Вы даже можете позволить аппаратному обеспечению Intel генерировать такую ошибку шины, установив какой-либо флаг ЦП. Но в целом использование невыровненных доступов — это нормально.
Это: mx3, Spooky, mirhash ( но не строгий ), MUM, fasthash, Murmur3*, Murmur2*, Metrohash* (все, кроме cmetro*), Crap8, Beamsplitter, Lookup3, Fletcher4, Fletcher2, все варианты sanmayce FNV1a_ (FNV1a_YT, FNV1A_Пиппип_Юрий, FNV1A_Totenschiff, ...), Фибоначчи.
Обычное решение проблемы — проверить выравнивание буфера либо в вызывающей стороне, либо предоставить цикл предварительной обработки для смещенного префикса, либо скопировать весь буфер в новую выровненную область. Поместите этот дополнительный код внутрь #ifdef HAVE_ALIGNED_ACCESS_REQUIRED
.
ооб - За пределами границ
Некоторые хеш-функции предполагают наличие дополненного входного буфера, доступ к которому возможен за пределами его длины, вплоть до размера слова. Это позволяет ускорить обработку цикла, поскольку для остальных не требуется второй цикл или таблица коммутации, но для этого требуется среда совместных вызовов, и поэтому это считается мошенничеством.
Переполнение целого числа со знаком
Простая ошибка типа: этот хэш должен использовать внутри себя беззнаковые целочисленные типы, чтобы избежать неопределенного и противоречивого поведения. т.е. SuperFastHash: переполнение целого числа со знаком: -2147483641 + -113 не может быть представлено в типе 'int'
переполнение показателя сдвига
С: FNV1A_Pippip_Yurii, FNV1A_Totenschiff, Pair_multiply_shift, показатель сдвига sumhash32 64 слишком велик для 64-битного типа 'long unsigned int'