in English

Алгоритмы общего назначения

Простые хэш-функции высокой производительности

Часть вторая


Множество лун тому назад было проведено общеизвестное тестирование качества простых хеш-функций общего назначения, в котором мы выявили слабые стороны ряда популярных алгоритмов. Как выяснилось, алгоритм может показывать себя довольно хорошо на определенных наборах тестового материала, а некоторых будет "сыпаться". Алгоритмы, основанные на понятной математической модели, ведут себя довольно стабильно, хотя и звезд с неба не хватают. К числу таких конструкций можно отнести алгоритмы семейства FNV. Такие функции, как правило, обладают сравнительно хорошей производительностью, качественным распределенением, соответственно и покажут примерно одинаковые результаты на различных наборах данных, включая сложные. К примеру, набор из практически идентичных строк, как-то список ip-адресов с различающимися двумя последними байтами, или даже слова одниковой длины - все это может оказаться сложным случаем для функций и некими контруктивными недостатками, но не составит труда хорошо для проработанной функции. Все тот же FNV, он родимый, довольно-таки умело справляется с вышеуказанным материалом. Примером стабильной функции в плане коллизионной чистоты можно назвать и разработку автора - функцию MaPrime2c. Этот нехитрый набор кода хотя и не отличается ошеломляющей производительностью, но имеет свои плюсы, среди которых: крайняя простота реализации, возможность использования в программно-технических (аппаратных) комплексах. Сравнительно с FNV, конечно же, этот алгорим будет медленнее. почему?

MaPrime2c

Оную функцию мы рассмотрели еще в первом выпуске. Что отличает ее от большинства существующих? В качестве подсисемы рассеивания здесь используется таблица замены (подстановки), которая инициирует массивное обращение к памяти. На аппаратных решениях это может быть выполнено весьма быстро, но программные реализации могут "проседать". Конструктивной причиной различия в производительности является еще и побайтовое сжатие, в отличие от 32-разрядного во многих из наиболее распространенных. Собственно этот момент и имеет две стороны - хорошее распределение и пропорциональное снижение производительности.

static const unsigned char sTable[256] =
{
  0xa3,0xd7,0x09,0x83,0xf8,0x48,0xf6,0xf4,0xb3,0x21,0x15,0x78,0x99,0xb1,0xaf,0xf9,
  0xe7,0x2d,0x4d,0x8a,0xce,0x4c,0xca,0x2e,0x52,0x95,0xd9,0x1e,0x4e,0x38,0x44,0x28,
  0x0a,0xdf,0x02,0xa0,0x17,0xf1,0x60,0x68,0x12,0xb7,0x7a,0xc3,0xe9,0xfa,0x3d,0x53,
  0x96,0x84,0x6b,0xba,0xf2,0x63,0x9a,0x19,0x7c,0xae,0xe5,0xf5,0xf7,0x16,0x6a,0xa2,
  0x39,0xb6,0x7b,0x0f,0xc1,0x93,0x81,0x1b,0xee,0xb4,0x1a,0xea,0xd0,0x91,0x2f,0xb8,
  0x55,0xb9,0xda,0x85,0x3f,0x41,0xbf,0xe0,0x5a,0x58,0x80,0x5f,0x66,0x0b,0xd8,0x90,
  0x35,0xd5,0xc0,0xa7,0x33,0x06,0x65,0x69,0x45,0x00,0x94,0x56,0x6d,0x98,0x9b,0x76,
  0x97,0xfc,0xb2,0xc2,0xb0,0xfe,0xdb,0x20,0xe1,0xeb,0xd6,0xe4,0xdd,0x47,0x4a,0x1d,
  0x42,0xed,0x9e,0x6e,0x49,0x3c,0xcd,0x43,0x27,0xd2,0x07,0xd4,0xde,0xc7,0x67,0x18,
  0x89,0xcb,0x30,0x1f,0x8d,0xc6,0x8f,0xaa,0xc8,0x74,0xdc,0xc9,0x5d,0x5c,0x31,0xa4,
  0x70,0x88,0x61,0x2c,0x9f,0x0d,0x2b,0x87,0x50,0x82,0x54,0x64,0x26,0x7d,0x03,0x40,
  0x34,0x4b,0x1c,0x73,0xd1,0xc4,0xfd,0x3b,0xcc,0xfb,0x7f,0xab,0xe6,0x3e,0x5b,0xa5,
  0xad,0x04,0x23,0x9c,0x14,0x51,0x22,0xf0,0x29,0x79,0x71,0x7e,0xff,0x8c,0x0e,0xe2,
  0x0c,0xef,0xbc,0x72,0x75,0x6f,0x37,0xa1,0xec,0xd3,0x8e,0x62,0x8b,0x86,0x10,0xe8,
  0x08,0x77,0x11,0xbe,0x92,0x4f,0x24,0xc5,0x32,0x36,0x9d,0xcf,0xf3,0xa6,0xbb,0xac,
  0x5e,0x6c,0xa9,0x13,0x57,0x25,0xb5,0xe3,0xbd,0xa8,0x3a,0x01,0x05,0x59,0x2a,0x46
};


#define PRIME_MULT 1717 unsigned int maPrime2cHash (unsigned char *str, unsigned int len) { unsigned int hash = len, i; for (i = 0; i != len; i++, str++) { hash ^= sTable[( *str + i) & 255]; hash = hash * PRIME_MULT; } return hash; }


MaFastPrime1

Что можно сказать о прошлой функции? Наш алгоритм вполне себе неплох, но существующая ныне система оценки в первую очередь смотрит на производительности. Если брать на вскидку актуальный список простых хеш функций общего назначения, где обычно присутствует и MaPrime2c, то мы увидим последнюю как-раз таких ближе к концу списка. По качеству распределения она будет одной из первых, по скорости - из последних. Почему так? Всё потому, что сейчас акцент ставится именно на скорости, соответственно и оптимизация смотрит именно в этом направлении. Указанный далее алгоритм сочетает в себе элементы конструкции MaPrime2c и новомодный базис некриптографических хешей - обработку блоками в 4 байта. Как видно, подход остался прежним, за исключением табличной замены, которая теперь отсутствует. Хвост, тоесть не кратные 4 байтам данные, сжимаются отдельно. В этом случае применяется классический подход. Что мы имеем в результате? Кто пан, а кто пропал - покажут тесты, но пока можно сказать одно. Алгоритм конструктивно быстрее, особенно на блоках кратных 32-м битам. На остальных наборах данных замедление не будет принципиально ощутимо, поскольку блоки будут невелики - не более трех байт.

unsigned int
maFastPrime1Hash(char *str, unsigned int len) {
	unsigned int hash = len, i = 0, k;
	long rem = len;
	unsigned char trail;

	const unsigned char * data = (const unsigned char *)str;

	while (rem >= 4) {
		k = *(unsigned int*)data;
		k += i++;
		hash ^= k;
		hash *= 171717;
		data += 4;
		rem -= 4;
	}

	while (rem >= 0) {
		trail = *(unsigned char*)data;
		trail += i++;
		hash ^= trail;
		hash *= 171717;
		data++;
		rem--;
	}

	return hash;
}



MaRushPrime1

Прошлый раз нам была представлена 32-х разрядная модификация классического алгоритма MaPrime2c. Как нам стало известно, она сочитает значительно увеличенную производительность (ввиду перехода на 4-х байтные блоки) и традиционную прозрачную структуру, основанную на простых математических операциях. Сам алгоритм не только не усложнился, но и даже "похудел" ввиду отсутствия таблицы подстановок. Безусловно, переход на 32-х разрядную обработку не мог сказаться на числе коллизий в итоге, за низкое количество которых мы так любим MaPrime2c. Будем считать это маленьким, необходимым злом. Но можно ли еще его ускорить саму функцию? Попробуем. Рассмотренный ранее FastPrime1c имеет одно особенность - там применяется побайтовый просмотр для некратных данных в конце строки. Что если мы будем использовать все тот же блок, забитый пустыми значениям до кратного? Скажется ли это на результате? Безусловно. В плане качества распределения FastPrime1 будет лучше, но, вероятно, масштаб новоприобретенных коллизий не будет столь велик?

unsigned int maRushPrime1Hash(char *str, unsigned int len) {
	unsigned int hash = len, i = 0, k;
	long rem = len;

	const unsigned char * data = (const unsigned char *)str;

	while (rem >= 4) {
		k = *(unsigned int*)data;
		k += i++;
		hash ^= k;
		hash *= 171717;
		data += 4;
		rem -= 4;
	}

	switch (rem) {
	case 3:
		k = (unsigned int)(data[0]) | (unsigned int)(data[1] << 8) |
			(unsigned int)(data[2] << 16);
		k += i++;
		hash ^= k;
		hash *= 171717;
		break;

	case 2:
		k = (unsigned int)(data[0]) | (unsigned int)(data[1] << 8);
		k += i++;
		hash ^= k;
		hash *= 171717;

		break;

	case 1:
		k = (unsigned int)(data[0]);
		k += i++;
		hash ^= k;
		hash *= 171717;
		break;

	}

	return hash;
}



От слов - к делу

Теория хороша, но посмотрим, все же, что покажет практика. Постараемся провести ряд независимых, но открытых тестов, характеризующих как качество функции, так и ее производительность. Объем материала в области разработки и оценки некриптографических функций общего назначения в настоящее время совсем не велик. Преобладает обилие "скоростных" тестов, но можно ли оценивать только скорость? Вероятно, для ряда назначений она первична, но опредяляющим для выбора того или иного алгоритма будет что? Простота в реализации на требуемой платформе, возможно - портируемость, понятная разработчику структура, оптимальное соотношение качества расределения (числа коллизий) и скорости на применяемом материале. Следует подчеркнуть последнее. Существуют алгоритмы, оптимальные, скажем, только для небольших или напротив - для больших объемов хешируемого материала. Некоторые алгоримы могут быть разработаны и оптимизированы, к примеру, для определенного пространства символов, некоторые могут "сыпаться" на сложном наборе схожего матерала. А тут даже при условии высокой производительности число ложных совпадений сведет всю фору на нет.

Приступим!

Проведем исключительно синтетический тест скорости. В данном испытании наши функции будут хешировать миллион случайных строк длиной 1024, 512, 256, 128 и 64 байта. Набор материала для всех функций един, перед выполнением батареи тестов приоритет процесса устанавливается на realtime (реального времени), а сам процесс выполняется лишь на одном из ядер ЦП для исключения возможных искажений информации. Результатом замера будет разница значений функции QueryPerfomanceTimer. Сам код скомпилирован С++ Builder 16.0 с оптимизацией "fastest possible code". Следует отметить, что исходный текст алгоримтов не был никоем образом оптимизирован, поэтому вся работа в этом направлении ведется лишь компилятором. Результаты отсортированы по сренему показателю процессорного времени. Соответственно, чем оно меньше, тем быстрее показал себя испытуемый.

Тест производительности функций - C++ Builder 16.0, Core i3 (2120)
Алгоритм Блок 1024 Блок 512 Блок 256 Блок 128 Блок 64 Среднее
maRushPrime1 1244557 617279 304915 148274 67909 476587
maFastPrime1 1256819 630568 315702 151684 79414 486837
XXH_fast32 1783725 942527 529087 293166 188866 747474
PaulHsieh 1806774 914041 469428 239142 123406 710558
SuperFastHash 1807338 919355 475918 242219 124304 713827
Murmur2A 1912092 977115 514278 283438 148806 767146
SBOX 2024283 1020267 516150 265498 128310 790902
XXH_strong32 2315467 1204298 649836 355381 216531 948303
Murmur3 2319545 1185148 623534 334233 162431 924978
lookup3 2736543 1361577 701587 350986 190662 1068271
Murmur2 2786721 1409774 705895 388551 188652 1095919
x17 3302670 1659110 844174 431555 212017 1289905
x31 3470177 1735343 867012 434077 217180 1344758
Fletcher 3611984 1802152 904394 461391 233072 1402599
CrapWow 3671547 1867617 969502 482704 257698 1449814
Crap8 3978523 2025220 1039849 524446 276836 1568975
FNV 3990102 1983903 974592 477033 224042 1529934
BKDR 3990114 1982633 978090 480394 228444 1531935
RS 4020749 2016471 1016928 511859 259719 1565145
DJB 4024528 2009826 1006361 500140 249948 1558161
Novak 4025595 2023000 1013481 513954 249758 1565158
maPrime2c 4455741 2236201 1128484 573223 298560 1738442
FNV1 4996581 2485097 1232743 603242 290693 1921671
LY 5011203 2492391 1232793 606098 288925 1926282
FNV1a 5029644 2502512 1234058 604452 286585 1931450
DEK 5185175 2594987 1301614 652183 331099 2013012
JS 5337259 2673945 1338547 674291 341385 2073085
ROT13 5541539 2771521 1401829 715148 370364 2160080
AP 5776146 2892157 1449848 730210 368307 2243334
SDBM 6489631 3247294 1625272 812330 412890 2517483
PJW-32 6754805 3384722 1780620 794241 398405 2622559
faq6 7023383 3514522 1757626 880206 442262 2723600
OneAtTime 7030164 3516195 1759438 881111 440109 2725403
Adler 7451228 3722339 1862235 937637 474971 2889682
ELF 8105071 3994902 1997420 963994 472225 3106722
crc32 9098139 4552497 2275140 1140333 568499 3526922
Goulburn 19898903 9944868 4969909 2479773 1237808 7706252

Попробуем выявить некую зависимость результатов от выбранного компилятора. В данном конкуретном случае будем использовать GNU GCC 4.4 с опцией "optimize even more" под процессор класса Intel Core 2 DUO

Тест производительности функций - GCC, Core i3 (2120)
Алгоритм Блок 1024 Блок 512 Блок 256 Блок 128 Блок 64 Среднее
Murmur3 838619 434583 233129 117777 67536 338329
maRushPrime1 985239 487258 235451 108938 59336 375244
maFastPrime1 987265 487651 237107 113610 62457 377618
Murmur2A 1030548 528850 279508 143899 82682 413097
Fletcher 1043723 532470 284191 157257 79471 419422
CrapWow 1218318 632412 320335 171458 96940 487893
SuperFastHash 1766861 891562 454188 229886 118928 692285
PaulHsieh 1768547 892574 454752 237264 120407 694709
lookup3 1812582 901704 461173 232755 125938 706830
Murmur2 1835496 924642 472608 233256 125337 718268
Novak 2018288 1015218 514747 264414 139732 790480
SBOX 2025111 1024183 521809 272217 144245 797513
DEK 2023839 1022941 524740 271793 147495 798162
XXH_fast32 2221415 1161824 623352 327402 194869 905772
XXH_strong32 2219179 1155987 624172 336413 203631 907876
Adler 2390338 1242010 646132 355438 202396 967263
Crap8 3507585 1736218 854243 414839 195451 1341667
FNV1a 3963692 1963048 960963 460312 211121 1511827
SDBM 3965399 1962686 963077 461841 211934 1512987
FNV1 3966417 1963141 963400 462641 212112 1513542
FNV 3967164 1966341 965549 465063 215456 1515915
BKDR 3968082 1966261 966290 465013 215969 1516323
RS 4005813 1992413 992504 491388 241029 1544629
x31 4000364 1997794 996632 496454 247281 1547705
DJB 4000003 2000477 998835 498773 248543 1549326
maPrime2c 4008522 2006902 1007230 504860 255655 1556634
x17 4989591 2486118 1236297 610283 298695 1924197
ROT13 5040218 2528102 1270083 642253 326986 1961528
JS 5313938 2662715 1336101 673775 341630 2065632
LY 5924865 2920826 1420998 669480 294610 2246156
AP 6097569 3052527 1529419 768813 386900 2367046
PJW-32 7213226 3408499 1685906 813942 379359 2700186
OneAtTime 7004766 3502779 1751694 876612 438130 2714796
faq6 7005885 3503871 1751325 875887 438137 2715021
ELF 7785573 3900946 1943880 935786 440138 3001265
crc32 8039939 4006116 1988645 979857 475834 3098078
Goulburn 16381053 8187208 4091069 2041737 1017776 6343769

А теперь протестируем код, скомпилированный на MSVC 10 с опциями "максимальная скорость" и "поддержка SIMD2"

Тест производительности функций - VC, Core i3 (2120)
Алгоритм Блок 1024 Блок 512 Блок 256 Блок 128 Блок 64 Среднее
XXH_fast32 387064 209512 125281 83372 62273 173500
XXH_strong32 747196 390723 212172 123254 78770 310423
CrapWow 894293 466712 230004 124500 71974 357497
maFastPrime1 992724 490133 240013 106687 57164 377344
maRushPrime1 995598 495754 244617 117622 53935 381505
Murmur3 973158 498728 263140 141842 72589 389891
Crap8 1048873 536968 263539 139505 78177 413412
Fletcher 1051002 529649 279864 154652 98048 422643
Murmur2A 1066592 547103 289669 152994 86545 428581
Murmur2 1832528 932993 478552 251542 127922 724707
Novak 2014241 1013862 512938 263097 136725 788173
SBOX 2019214 1018139 517176 266749 141932 792642
Adler 2032708 1030831 530416 280566 153515 805607
PaulHsieh 2258486 1132260 569681 287776 146209 878882
SuperFastHash 2261195 1134828 568226 291380 147089 880544
lookup3 2448723 1228724 630957 320068 177789 961252
FNV 3959524 1962414 957487 457520 207007 1508790
FNV1a 3962435 1959820 961026 458772 209179 1510246
FNV1 3962333 1961136 959499 461291 210711 1510994
SDBM 3965930 1964994 963843 463292 213151 1514242
BKDR 3968377 1964106 964572 462716 213332 1514621
RS 3997310 1991724 990365 491878 240061 1542268
DJB 4007578 1995398 995553 495735 244506 1547754
x31 4003208 1999112 996971 496756 247247 1548659
DEK 4178868 2089877 1046554 524355 263877 1620706
ROT13 4252865 2132431 1066144 535742 268652 1651167
JS 5285993 2645633 1324626 667425 337052 2052146
LY 5922553 2919080 1417699 667245 292121 2243740
AP 5859845 2935032 1474813 743117 377785 2278118
x17 5982711 2980159 1477295 725353 349884 2303080
PJW-32 6781367 3392251 1654490 807060 376249 2602283
OneAtTime 6986047 3483098 1731091 857126 417991 2695071
faq6 6989172 3484847 1732885 857976 420930 2697162
ELF 7788886 3916828 1922221 931236 436961 2999226
crc32 8189748 4059546 2046837 1024389 476197 3159343
maPrime2c 9416305 4695518 2335524 1155650 565057 3633611
Goulburn 18403890 9201737 4603225 2298500 1148928 7131256

Стоит для чистоты тестов провести их и на ином оборудовании. В данном случае использован вариант с C++ Builder 16 на AMD Athlon II X4 640

Тест производительности функций - C++ Builder, Athlon II X4 640
Алгоритм Блок 1024 Блок 512 Блок 256 Блок 128 Блок 64 Среднее
maRushPrime1 1276876 649660 337051 180068 101712 509073
maFastPrime1 1302567 657798 347311 190802 109621 521620
SuperFastHash 1787138 915575 472668 252467 142837 714137
PaulHsieh 1798522 920685 477374 253563 142875 718604
XXH_fast32 1844059 969305 557745 336322 206321 782750
Murmur3 2481660 1289680 664611 321909 182967 988165
lookup3 2645612 1338647 692945 348208 194072 1043897
Murmur2A 2652082 1341862 691849 377577 213387 1055351
SBOX 3035031 1533775 777536 402108 213356 1192361
x31 3287751 1657544 840891 431534 227966 1289137
Murmur2 3552961 1787991 910111 469898 252508 1394694
x17 3803839 1921528 973932 501438 266137 1493375
FNV 4042619 2025140 1022646 521439 271007 1576570
BKDR 4083692 2091706 1025921 521654 271083 1598811
CrapWow 4111142 2090474 1052960 543106 279016 1615340
DJB 4139572 2146085 1019888 560080 267997 1626724
Novak 4303238 2175392 1098429 565460 298345 1688173
XXH_strong32 4578382 2338603 1221752 629117 317256 1817022
Fletcher 4661857 2346383 1192765 619656 328717 1829876
Crap8 4867837 2491960 1162351 671597 343422 1907433
FNV1 5033460 2523836 1267885 642884 328774 1959368
LY 5040469 2527927 1270041 644768 331109 1962863
FNV1a 5043173 2529903 1271916 646720 333126 1964968
DEK 5041499 2527580 1281313 646662 333633 1966137
JS 5044004 2531296 1275941 649816 336544 1967520
ROT13 5038480 2530108 1287027 648140 335113 1967774
RS 5049312 2590263 1291189 651116 337822 1983940
SDBM 6041150 3029485 1536178 771226 395187 2354645
maPrime2c 6041797 3035507 1531717 775170 399741 2356786
AP 6046528 3040173 1531749 773939 398615 2358201
crc32 7045577 3543502 1777067 899454 460766 2745273
OneAtTime 7041538 3540406 1780104 904057 462763 2745774
faq6 7051014 3540846 1778909 903420 466674 2748173
ELF 8891171 4449007 2148804 1096976 527386 3422669
PJW-32 8902362 4456197 2162512 1109942 540072 3434217
Adler 9243471 4672593 2371788 1225964 649589 3632681
Goulburn 16064024 8049788 4034188 2030667 1026199 6240973

Теперь проведем общий "забег" алгоритмов, скомпилированных GCC с опцией "Athlon64 tuning" на AMD Athlon II X4 640

Тест производительности функций - GCC, Athlon II X4 640
Алгоритм Блок 1024 Блок 512 Блок 256 Блок 128 Блок 64 Среднее
maRushPrime1 1031436 530447 279937 154523 91010 417471
maFastPrime1 1034439 533328 282839 157786 94912 420661
Fletcher 1077664 537186 286703 161486 98796 432367
Murmur3 1407439 718632 373864 201611 115536 563416
CrapWow 1445628 741801 389481 210438 109598 579389
lookup3 1709167 856247 443135 221154 122456 670432
PaulHsieh 1789052 911028 472978 253449 144772 714256
SuperFastHash 1794623 912429 472978 254435 144854 715864
Murmur2A 2042096 916467 478416 258349 161419 771349
Adler 2040493 1037221 536273 285842 160395 812045
XXH_fast32 2169841 1132378 613665 334594 205583 891212
XXH_strong32 2461215 1343570 717123 384566 234027 1028100
Murmur2 2788813 1411096 722234 377909 204525 1100915
DEK 3033780 1526401 774954 399162 211549 1189169
SBOX 3033454 1527676 775825 400258 215213 1190485
Novak 3038003 1528396 777774 401157 214441 1191954
Crap8 3521311 1783001 902052 473573 229714 1381930
FNV1 4027738 2022724 1021390 519564 270099 1572303
BKDR 4029177 2024496 1022479 521576 271201 1573786
SDBM 4033660 2024509 1022698 521505 271282 1574731
FNV1a 4038233 2023669 1021816 520705 270963 1575077
x31 4037670 2026545 1023351 523556 272969 1576818
DJB 4039558 2025730 1024341 522804 273034 1577093
maPrime2c 4040078 2027291 1025466 524532 274995 1578472
FNV 4056731 2024905 1022583 521687 271214 1579424
x17 4533838 2273142 1145790 582125 300642 1767107
JS 5032462 2526537 1274027 647706 334655 1963077
LY 5043642 2526528 1273801 647858 334723 1965310
ROT13 5036414 2529626 1276842 650600 336832 1966063
RS 5043070 2530609 1276107 651653 337531 1967794
AP 5557079 2794754 1416045 727981 383615 2175895
crc32 6043525 3030498 1526547 775840 400107 2355303
OneAtTime 7042982 3533191 1776803 901126 463749 2743570
faq6 7047681 3531386 1776885 901177 463692 2744164
PJW-32 7986285 3921814 1971487 976387 457921 3062779
ELF 8910780 4390610 2193539 1092809 506889 3418925
Goulburn 14063700 7040201 3533367 1779770 903049 5464017

Посмотрим, как покажет себя код, генерированный компилятором MSVC на AMD Athlon II X4 640

Тест производительности функций - MSVC, Athlon II X4 640
Алгоритм Блок 1024 Блок 512 Блок 256 Блок 128 Блок 64 Среднее
XXH_fast32 318149 188903 126236 77332 61610 154446
CrapWow 913259 475601 256396 146738 72340 372867
XXH_strong32 931756 494165 274980 147826 92938 388333
Crap8 1038746 536122 285870 160414 81218 420474
maRushPrime1 1049782 529420 278829 154842 90970 420769
maFastPrime1 1027678 550250 280862 154545 91961 421059
Fletcher 1133253 582099 306439 167294 96839 457185
Murmur3 1278271 559919 293479 160552 93903 477225
Murmur2A 2039563 1037115 536196 284713 159692 811456
Adler 2237365 1133117 583427 306247 165396 885110
SuperFastHash 2285041 1157674 593866 312036 172177 904159
PaulHsieh 2286253 1158831 594814 312150 171262 904662
lookup3 2301969 1165440 605843 309213 173173 911128
SBOX 3028994 1527455 774944 400161 211370 1188585
Novak 3031082 1527307 776086 400165 212489 1189426
Murmur2 3036939 1533393 781753 405121 217505 1194942
FNV1 4025016 2020490 1018458 517549 267114 1569725
SDBM 4025708 2021609 1019616 517501 267135 1570314
BKDR 4025851 2021583 1019759 517501 267138 1570366
FNV 4025671 2021992 1019706 517461 267127 1570391
DEK 4025857 2021755 1019743 517587 268136 1570616
FNV1a 4027384 2022651 1020516 519585 269097 1571847
ROT13 4028332 2023511 1021617 520666 270038 1572833
x31 4028802 2025668 1022658 522426 271013 1574113
DJB 4065424 2022554 1254230 518627 268081 1625783
LY 5026659 2521434 1269099 642790 329725 1957941
x17 5027436 2524805 1270060 645774 330757 1959766
JS 5030291 2523543 1270972 643754 331656 1960043
AP 5591435 2777962 1396457 707437 363018 2167262
crc32 6033655 3027303 1524398 773169 396245 2350954
RS 6037080 3030264 1528550 776943 398165 2354200
OneAtTime 7035983 3528618 1775104 898160 460075 2739588
faq6 7035749 3528481 1775209 898129 461906 2739895
maPrime2c 7040283 3532353 1779045 901212 461805 2742940
PJW-32 8093938 3977967 2001206 1005366 455895 3106874
ELF 8901288 4380785 2183000 1079194 500934 3409040
Goulburn 16055419 8039111 4031465 2027666 1025439 6235820

А теперь отойдем от чисто синтетических исследований и совместим наше испытанием с вычислением качества функции, проще говоря, замерим число коллизий (случайных совпадений) на большом массиве информации. В качестве тестового материала выбран все тот же, содержащий слова, отсортированные в алфавитном порядке. В основе оного - заголовки из Русской Википедии, Большой советской энциклопедии, Большого англо-русского словаря и других словарных источников в общем колличестве 2726299 уникальных слова. Важно отменить, что все тексты - в кодировке cp866, минимальная длина - 3 символа, регистр - верхний. Исходный код скомпилирован на C++ Builder, как и в синтетическом тесте. Замер выполняется на AMD Athlon II X4 640. Отличие от синтетического теста здесь подсчет временных характеристик выполняется суммированием времени вычисления отдельных строк, что более приближено к реальным условия работы типового приложения. Набор тестов от A до H идентичен методике прошлого теста. В данной таблице результаты отсортированы по числу коллизиций, т.е. по качеству функции в рамках исследования.

Тест качества функций -BCC, Athlon II X4 640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
maPrime2c 804 579597 814 603757 810 660091 873 678113 856 780422 869 1149810 796 559979 864 770582 836 722794
lookup3 886 512573 868 521577 900 555375 785 565621 867 635126 892 838975 831 510724 834 627614 858 595948
crc32 856 593875 856 624996 856 697340 856 717613 886 833701 827 1258657 899 592678 859 828011 862 768359
Murmur2A 848 558954 847 554577 922 598009 836 604478 990 658961 1140 865412 879 540226 861 670544 915 631395
OneAtTime 947 601329 947 619889 947 699977 947 725203 889 832536 869 1258727 906 594367 913 839883 921 771489
faq6 947 615677 947 631117 947 707682 947 729119 889 841544 869 1263209 906 602742 913 838249 921 778667
Murmur2 861 509505 864 518539 808 568075 823 580776 1138 656812 1832 916244 836 497703 874 656874 1005 613066
ROT13 987 562620 1016 581446 1095 650588 1129 662945 1015 745545 964 1065416 928 559499 1459 739350 1074 695926
Murmur3 887 501526 860 515583 826 555354 829 558233 2097 607446 2330 800575 861 498778 854 604182 1193 580210
AP 873 589912 887 611396 827 667772 813 683480 1416 786116 4568 1150718 885 587111 842 773535 1389 731255
LY 819 527462 819 541318 819 607587 819 623707 1748 721364 3543 1032331 883 521198 1766 709144 1402 660514
BKDR 860 526014 860 534022 860 584938 860 596272 1708 673899 3548 933135 894 509321 1906 666115 1437 627965
FNV1a 807 530127 807 546351 807 614627 807 629871 2650 711365 5235 1036196 910 518998 1695 731534 1715 664884
FNV1 869 535479 869 553619 869 615312 869 633290 2589 719605 5209 1028773 899 524284 1758 716713 1741 665884
DJB 1152 513714 1152 524336 1152 577459 1152 593538 2081 659674 3787 929148 1180 503533 5952 664861 2201 620783
SBOX 1511 547072 1521 557584 1608 607298 1594 616877 2722 685757 4940 903457 1530 540407 2308 692089 2217 643818
FNV 873 516497 873 524672 873 577357 873 592250 4436 660236 9037 928300 800 501836 3386 677194 2644 622293
RS 845 565776 896 577576 877 637797 867 655562 2092 745452 9298 1049948 802 550456 6375 731127 2757 689212
maFastPrime1 1063 510234 1096 519945 1107 550235 1057 552829 5065 571797 11610 673763 1070 506514 851 566163 2865 556435
maRushPrime1 1077 447572 1107 453776 1481 484718 1076 490518 5089 526227 11621 657008 1112 444282 926 516711 2936 502602
Crap8 851 621378 875 623953 870 668268 886 677415 9523 758838 9633 1051668 861 611401 868 749169 3046 720261
PaulHsieh 4987 471788 3889 488979 3934 512539 3935 516937 2066 566527 1873 722554 3862 463620 968 557745 3189 537586
SuperFastHash 4987 504043 3889 538659 3934 551131 3935 586711 2066 587898 1873 735826 3862 551007 968 628546 3189 585478
JS 3513 542088 4151 559277 6105 622518 6735 635679 1009 729897 881 1040217 3350 534743 898 716972 3330 672674
x31 3266 504118 3227 512310 3292 562971 3231 572253 4930 653800 7414 866495 2650 488236 3053 654396 3883 601822
Goulburn 5309 855933 9635 895867 22197 1047852 26506 1091273 5218 1317704 5312 2214734 5380 842644 5311 1331689 10609 1199712
SDBM 943 556342 943 578487 943 648213 943 665347 14996 768275 30196 1141981 869 554351 89196 781506 17379 711813
x17 25281 501158 25346 513582 25254 570758 25239 598536 26179 668425 27892 928161 23828 496324 1903 665083 22615 617753
XXH_strong32 19080 600859 17624 614373 77297 681540 85310 707050 135521 833510 126831 1141187 4418 601968 1277 829263 58420 751219
XXH_fast32 19097 585011 17620 599021 77324 657700 85329 677954 135567 776863 138572 963122 4424 574768 1312 764812 59906 699906
DEK 6824 533793 5474 553251 5362 615706 5070 640879 24564 714458 422012 1037047 8629 531949 1820 715478 59969 667820
CrapWow 996 581273 970 586921 1006 639691 996 657019 397113 741580 683161 1001046 1026 567891 2757 740052 136003 689434
ELF 52291 595540 268965 613364 268965 685281 268733 712980 455236 850980 706374 1387958 49808 587768 70326 850870 267587 785593
PJW-32 52291 612975 268965 632833 268965 706575 268733 733993 455236 865631 706374 1419954 49808 607517 70326 862341 267587 805227
Fletcher 434075 582084 30303 599523 30349 655327 36015 667890 284334 760545 282984 1057931 250407 578489 2174482 763831 440369 708203
Novak 753734 542963 753734 543893 753734 603313 753734 618332 597509 704157 598661 992766 729428 526979 34043 701231 621822 654204
Adler 1952330 783743 1952330 811325 1952330 905736 1952330 939773 1951871 1078973 1951872 1609978 1952044 781131 2709710 1067858 2046852 997315

Отсортируем результаты по времени выполнения. Выше расположены функции, лучшие по данному показателю на все том же наборе данных. Результаты в виде электронной таблицы расположены здесь.

Тест времени выполнения функций -BCC, Athlon II X4 640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
maRushPrime1 1077 447572 1107 453776 1481 484718 1076 490518 5089 526227 11621 657008 1112 444282 926 516711 2936 502602
PaulHsieh 4987 471788 3889 488979 3934 512539 3935 516937 2066 566527 1873 722554 3862 463620 968 557745 3189 537586
maFastPrime1 1063 510234 1096 519945 1107 550235 1057 552829 5065 571797 11610 673763 1070 506514 851 566163 2865 556435
Murmur3 887 501526 860 515583 826 555354 829 558233 2097 607446 2330 800575 861 498778 854 604182 1193 580210
SuperFastHash 4987 504043 3889 538659 3934 551131 3935 586711 2066 587898 1873 735826 3862 551007 968 628546 3189 585478
lookup3 886 512573 868 521577 900 555375 785 565621 867 635126 892 838975 831 510724 834 627614 858 595948
x31 3266 504118 3227 512310 3292 562971 3231 572253 4930 653800 7414 866495 2650 488236 3053 654396 3883 601822
Murmur2 861 509505 864 518539 808 568075 823 580776 1138 656812 1832 916244 836 497703 874 656874 1005 613066
x17 25281 501158 25346 513582 25254 570758 25239 598536 26179 668425 27892 928161 23828 496324 1903 665083 22615 617753
DJB 1152 513714 1152 524336 1152 577459 1152 593538 2081 659674 3787 929148 1180 503533 5952 664861 2201 620783
FNV 873 516497 873 524672 873 577357 873 592250 4436 660236 9037 928300 800 501836 3386 677194 2644 622293
BKDR 860 526014 860 534022 860 584938 860 596272 1708 673899 3548 933135 894 509321 1906 666115 1437 627965
Murmur2A 848 558954 847 554577 922 598009 836 604478 990 658961 1140 865412 879 540226 861 670544 915 631395
SBOX 1511 547072 1521 557584 1608 607298 1594 616877 2722 685757 4940 903457 1530 540407 2308 692089 2217 643818
Novak 753734 542963 753734 543893 753734 603313 753734 618332 597509 704157 598661 992766 729428 526979 34043 701231 621822 654204
LY 819 527462 819 541318 819 607587 819 623707 1748 721364 3543 1032331 883 521198 1766 709144 1402 660514
FNV1a 807 530127 807 546351 807 614627 807 629871 2650 711365 5235 1036196 910 518998 1695 731534 1715 664884
FNV1 869 535479 869 553619 869 615312 869 633290 2589 719605 5209 1028773 899 524284 1758 716713 1741 665884
DEK 6824 533793 5474 553251 5362 615706 5070 640879 24564 714458 422012 1037047 8629 531949 1820 715478 59969 667820
JS 3513 542088 4151 559277 6105 622518 6735 635679 1009 729897 881 1040217 3350 534743 898 716972 3330 672674
RS 845 565776 896 577576 877 637797 867 655562 2092 745452 9298 1049948 802 550456 6375 731127 2757 689212
CrapWow 996 581273 970 586921 1006 639691 996 657019 397113 741580 683161 1001046 1026 567891 2757 740052 136003 689434
ROT13 987 562620 1016 581446 1095 650588 1129 662945 1015 745545 964 1065416 928 559499 1459 739350 1074 695926
XXH_fast32 19097 585011 17620 599021 77324 657700 85329 677954 135567 776863 138572 963122 4424 574768 1312 764812 59906 699906
Fletcher 434075 582084 30303 599523 30349 655327 36015 667890 284334 760545 282984 1057931 250407 578489 2174482 763831 440369 708203
SDBM 943 556342 943 578487 943 648213 943 665347 14996 768275 30196 1141981 869 554351 89196 781506 17379 711813
Crap8 851 621378 875 623953 870 668268 886 677415 9523 758838 9633 1051668 861 611401 868 749169 3046 720261
maPrime2c 804 579597 814 603757 810 660091 873 678113 856 780422 869 1149810 796 559979 864 770582 836 722794
AP 873 589912 887 611396 827 667772 813 683480 1416 786116 4568 1150718 885 587111 842 773535 1389 731255
XXH_strong32 19080 600859 17624 614373 77297 681540 85310 707050 135521 833510 126831 1141187 4418 601968 1277 829263 58420 751219
crc32 856 593875 856 624996 856 697340 856 717613 886 833701 827 1258657 899 592678 859 828011 862 768359
OneAtTime 947 601329 947 619889 947 699977 947 725203 889 832536 869 1258727 906 594367 913 839883 921 771489
faq6 947 615677 947 631117 947 707682 947 729119 889 841544 869 1263209 906 602742 913 838249 921 778667
ELF 52291 595540 268965 613364 268965 685281 268733 712980 455236 850980 706374 1387958 49808 587768 70326 850870 267587 785593
PJW-32 52291 612975 268965 632833 268965 706575 268733 733993 455236 865631 706374 1419954 49808 607517 70326 862341 267587 805227
Adler 1952330 783743 1952330 811325 1952330 905736 1952330 939773 1951871 1078973 1951872 1609978 1952044 781131 2709710 1067858 2046852 997315
Goulburn 5309 855933 9635 895867 22197 1047852 26506 1091273 5218 1317704 5312 2214734 5380 842644 5311 1331689 10609 1199712

Теперь усложним тест. Вместо слов различной длины у нас будет фиксированный список слов, различающихся незначительно. В качестве материала выбран список IP адресов, имеющих массу случайных совпадений. В данной таблице рассмотрим число выявленных коллизий в порядке возрастания. Результаты можно скачать в виде электронной таблицы не иначе как здесь.

Тест качества функций -BCC, Athlon II X4 640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
AP 0 676632 0 677284 0 744655 0 765078 0 931299 0 1486240 0 672287 0 913888 0 858420
crc32 0 710641 0 716106 0 787135 0 800364 0 1009105 0 1672227 0 694246 0 990754 0 922572
x17 0 516836 0 559699 0 577842 0 594776 0 739697 0 1151253 0 536210 420 731856 53 676021
BKDR 0 575134 0 579530 0 638370 0 643083 0 820401 0 1188280 0 555183 1284 731691 161 716459
ROT13 0 653847 0 731015 60 709104 117 742615 1224 937476 870 1422099 247 646914 1431 894502 494 842197
Murmur2A 893 555029 798 590956 798 591975 868 615911 891 696745 829 1029091 795 556930 881 664499 844 662642
Murmur2 880 548956 800 572603 784 577007 898 610429 849 723239 891 1117976 824 539446 850 685057 847 671839
maPrime2c 865 670135 837 679477 926 729093 833 756687 887 904343 845 1516549 751 653689 869 897250 852 850903
lookup3 885 565103 845 558699 895 578477 867 572985 881 663866 866 939515 827 558197 876 645900 868 635343
OneAtTime 890 709132 890 728594 890 784932 890 826408 865 1017486 868 1665030 913 701058 875 987220 885 927483
faq6 890 719006 890 757007 890 802614 890 819951 865 1021794 868 1676274 913 724211 875 999362 885 940027
Murmur3 812 517002 864 505535 843 541908 868 581512 912 618005 875 963553 1363 526081 868 609533 926 607891
FNV1 1080 612921 1080 634421 1080 661274 1080 684171 2227 875818 4564 1335872 930 608379 1734 819439 1722 779037
FNV1a 1108 618527 1108 635356 1108 687449 1108 719850 2333 848855 4613 1327275 1073 628311 1710 811771 1770 784674
SBOX 1572 556901 1491 563771 1517 593644 1487 604526 2874 757631 4831 1071376 1558 559337 2265 750190 2199 682172
FNV 736 584406 736 590968 736 623604 736 651559 3500 739888 7166 1162986 810 554596 3390 728996 2226 704625
JS 3620 611290 4272 647102 6278 679128 6701 689751 916 845735 896 1337408 3045 606129 2682 818967 3551 779439
LY 5740 618026 5740 637781 5740 666853 5740 692467 5740 837361 5740 1330350 0 590703 0 810798 4305 773042
Crap8 1723 652871 1693 634303 1670 703677 1653 678178 833 841386 823 1220524 68751 652180 823 811060 9746 774272
Goulburn 5741 1079085 9987 1123018 22413 1257161 26734 1318281 5763 1751528 5547 3129221 17923 1109174 17707 1724587 13977 1561507
PaulHsieh 20533 489495 26937 491486 21965 518552 31937 512496 979 579264 1641 849274 55851 493499 974 561294 20102 561920
SuperFastHash 20533 540178 26937 511295 21965 544051 31937 568783 979 608325 1641 844626 55851 528602 974 640570 20102 598304
DJB 0 583347 0 596363 0 621411 0 630173 0 744963 1984 1258970 0 573293 194327 729651 24539 717271
maFastPrime1 954 596541 68070 472795 78406 611041 69606 478776 927 624145 849 748957 592 573217 40181 583830 32448 586163
maRushPrime1 111076 440042 68070 484354 78406 471221 69606 475307 995 521672 849 758680 592 450227 40181 495588 46222 512136
x31 0 518166 0 554843 0 576124 0 598499 3888 735189 16776 1080780 6510 534742 356070 698270 47906 662077
RS 0 643460 0 661726 0 702987 0 703973 0 859116 612 1363550 824 624821 600319 838081 75219 799714
CrapWow 39206 664748 35814 662408 35768 704792 38757 709703 16914 870385 948 1220214 1254466 640014 4347 825153 178278 787177
SDBM 0 667482 0 690221 0 714714 0 761954 38648 898898 180052 1493314 1080 646298 1598364 891864 227268 845593
DEK 253552 615758 253552 637852 253552 676166 253552 698337 253552 842007 292720 1340523 548736 599204 0 815986 263652 778229
Novak 451364 582537 451364 588956 451364 640118 451364 653316 451364 817564 451364 1249891 431483 578185 4196 790680 392983 737656
XXH_strong32 0 631923 2723231 727712 2696939 928083 2696939 889008 2696708 930151 126465 1384910 0 637598 126458 904396 1383343 879223
ELF 253884 689238 1491098 714653 1491098 771251 1073498 816221 1496649 1057953 2614453 1969613 1180553 669283 2432140 1054433 1504172 967831
PJW-32 253884 698212 1491098 722998 1491098 801516 1073498 832159 1496649 1067401 2614453 2000505 1180553 696415 2432140 1069228 1504172 986054
XXH_fast32 0 625563 2723231 718912 2696939 783067 2696939 846301 2696956 814317 1814790 1038163 0 636635 140662 777054 1596190 780002
Fletcher 2647939 640798 2489172 668079 2489172 674048 2489172 738835 2693041 867037 2693041 1324908 2489172 630429 2720961 854875 2588959 799876
Adler 2721044 911108 2721044 936121 2721044 1022278 2721044 1056365 2721044 1198343 2721044 1893175 2721044 927094 2726245 1180912 2721694 1140675

Посмотрим теперь время вычисления хешей в предыдущем тесте. Простые математические функции были исключительно хороши, показав полное отсутствие случайных совпадений. Какова их производительность? Результаты можно скачать в виде электронной таблицы не иначе как здесь.

Тест скорости функций BCC, Athlon II X4 640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
maRushPrime1 111076 440042 68070 484354 78406 471221 69606 475307 995 521672 849 758680 592 450227 40181 495588 46222 512136
PaulHsieh 20533 489495 26937 491486 21965 518552 31937 512496 979 579264 1641 849274 55851 493499 974 561294 20102 561920
maFastPrime1 954 596541 68070 472795 78406 611041 69606 478776 927 624145 849 748957 592 573217 40181 583830 32448 586163
SuperFastHash 20533 540178 26937 511295 21965 544051 31937 568783 979 608325 1641 844626 55851 528602 974 640570 20102 598304
Murmur3 812 517002 864 505535 843 541908 868 581512 912 618005 875 963553 1363 526081 868 609533 926 607891
lookup3 885 565103 845 558699 895 578477 867 572985 881 663866 866 939515 827 558197 876 645900 868 635343
x31 0 518166 0 554843 0 576124 0 598499 3888 735189 16776 1080780 6510 534742 356070 698270 47906 662077
Murmur2A 893 555029 798 590956 798 591975 868 615911 891 696745 829 1029091 795 556930 881 664499 844 662642
Murmur2 880 548956 800 572603 784 577007 898 610429 849 723239 891 1117976 824 539446 850 685057 847 671839
x17 0 516836 0 559699 0 577842 0 594776 0 739697 0 1151253 0 536210 420 731856 53 676021
SBOX 1572 556901 1491 563771 1517 593644 1487 604526 2874 757631 4831 1071376 1558 559337 2265 750190 2199 682172
FNV 736 584406 736 590968 736 623604 736 651559 3500 739888 7166 1162986 810 554596 3390 728996 2226 704625
BKDR 0 575134 0 579530 0 638370 0 643083 0 820401 0 1188280 0 555183 1284 731691 161 716459
DJB 0 583347 0 596363 0 621411 0 630173 0 744963 1984 1258970 0 573293 194327 729651 24539 717271
Novak 451364 582537 451364 588956 451364 640118 451364 653316 451364 817564 451364 1249891 431483 578185 4196 790680 392983 737656
LY 5740 618026 5740 637781 5740 666853 5740 692467 5740 837361 5740 1330350 0 590703 0 810798 4305 773042
Crap8 1723 652871 1693 634303 1670 703677 1653 678178 833 841386 823 1220524 68751 652180 823 811060 9746 774272
DEK 253552 615758 253552 637852 253552 676166 253552 698337 253552 842007 292720 1340523 548736 599204 0 815986 263652 778229
FNV1 1080 612921 1080 634421 1080 661274 1080 684171 2227 875818 4564 1335872 930 608379 1734 819439 1722 779037
JS 3620 611290 4272 647102 6278 679128 6701 689751 916 845735 896 1337408 3045 606129 2682 818967 3551 779439
XXH_fast32 0 625563 2723231 718912 2696939 783067 2696939 846301 2696956 814317 1814790 1038163 0 636635 140662 777054 1596190 780002
FNV1a 1108 618527 1108 635356 1108 687449 1108 719850 2333 848855 4613 1327275 1073 628311 1710 811771 1770 784674
CrapWow 39206 664748 35814 662408 35768 704792 38757 709703 16914 870385 948 1220214 1254466 640014 4347 825153 178278 787177
RS 0 643460 0 661726 0 702987 0 703973 0 859116 612 1363550 824 624821 600319 838081 75219 799714
Fletcher 2647939 640798 2489172 668079 2489172 674048 2489172 738835 2693041 867037 2693041 1324908 2489172 630429 2720961 854875 2588959 799876
ROT13 0 653847 0 731015 60 709104 117 742615 1224 937476 870 1422099 247 646914 1431 894502 494 842197
SDBM 0 667482 0 690221 0 714714 0 761954 38648 898898 180052 1493314 1080 646298 1598364 891864 227268 845593
maPrime2c 865 670135 837 679477 926 729093 833 756687 887 904343 845 1516549 751 653689 869 897250 852 850903
AP 0 676632 0 677284 0 744655 0 765078 0 931299 0 1486240 0 672287 0 913888 0 858420
XXH_strong32 0 631923 2723231 727712 2696939 928083 2696939 889008 2696708 930151 126465 1384910 0 637598 126458 904396 1383343 879223
crc32 0 710641 0 716106 0 787135 0 800364 0 1009105 0 1672227 0 694246 0 990754 0 922572
OneAtTime 890 709132 890 728594 890 784932 890 826408 865 1017486 868 1665030 913 701058 875 987220 885 927483
faq6 890 719006 890 757007 890 802614 890 819951 865 1021794 868 1676274 913 724211 875 999362 885 940027
ELF 253884 689238 1491098 714653 1491098 771251 1073498 816221 1496649 1057953 2614453 1969613 1180553 669283 2432140 1054433 1504172 967831
PJW-32 253884 698212 1491098 722998 1491098 801516 1073498 832159 1496649 1067401 2614453 2000505 1180553 696415 2432140 1069228 1504172 986054
Adler 2721044 911108 2721044 936121 2721044 1022278 2721044 1056365 2721044 1198343 2721044 1893175 2721044 927094 2726245 1180912 2721694 1140675
Goulburn 5741 1079085 9987 1123018 22413 1257161 26734 1318281 5763 1751528 5547 3129221 17923 1109174 17707 1724587 13977 1561507

Усложним еще нашу задачу. Что если мы в качестве тестового набора возьмем пакет схожих, ограниченных небольшим пространством, символов? Проведем тестирование на группе IP адресов, записаных без свободных нулей. В данном случае сгрупируем по числу коллизий. Результаты тут.

Тест качества функций BCC, Athlon II X4 640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
faq6 812 600005 812 639768 812 702003 812 728264 877 869339 856 1421989 844 607349 834 877003 832 805715
OneAtTime 812 608546 812 641132 812 710368 812 726712 877 871128 856 1413162 844 603179 834 875666 832 806237
maPrime2c 908 570474 817 603024 843 662202 834 677894 852 801734 851 1289177 897 565889 891 806199 862 747074
lookup3 872 489802 880 516491 892 532352 874 539643 863 583700 884 837563 865 492632 911 589214 880 572675
Murmur2A 850 521611 798 533038 877 556597 848 577397 1120 611878 1364 906513 830 522121 839 626557 941 606964
Murmur3 901 474070 882 485885 852 511794 874 516785 972 561498 1348 825180 933 472959 842 566074 951 551781
Murmur2 857 473264 873 490693 846 520631 906 538581 1103 616492 1889 970944 923 484762 873 624191 1034 589945
crc32 1155 616384 1155 645086 1155 703019 1155 725574 801 876004 859 1421234 1318 615989 861 890113 1057 811675
ROT13 977 557406 1002 579267 1076 638053 1089 647648 1115 794916 1035 1237511 842 554082 1469 759803 1076 721086
LY 862 520911 862 547286 862 606202 862 629063 1615 723546 4631 1145977 792 520102 1645 730173 1516 677908
AP 699 596768 700 611461 685 661567 709 684894 1719 802810 6116 1287297 790 598561 808 813916 1528 757159
BKDR 639 503451 639 524770 639 567920 639 579496 1533 663045 3406 1020730 787 497588 4168 670179 1556 628397
x17 907 479941 903 494136 693 525659 1043 536593 1712 656054 3546 1006225 711 484909 4409 661099 1741 605577
FNV1a 937 525014 937 554741 937 610337 937 629870 2721 729065 5290 1148294 884 520337 1802 732663 1806 681290
FNV1 982 512640 982 541733 982 600561 982 610896 2706 721205 5328 1145683 890 518892 1691 726157 1818 672221
JS 1479 538540 2168 563729 4169 615457 4635 634166 942 738583 944 1159551 1445 533942 1229 757806 2126 692722
SBOX 1533 447508 1531 468539 1508 484687 1515 501030 2818 602248 4919 911811 1528 448451 2325 611906 2210 559523
RS 835 541779 860 567362 864 619388 850 632621 1934 741889 8278 1176526 800 537599 5057 750506 2435 695959
FNV 901 498574 901 532511 901 572200 901 580678 4624 667106 9073 1022888 801 492040 3457 670248 2695 629531
DJB 840 495315 840 517087 840 569881 840 574197 1591 662806 3463 1030377 738 491342 32051 668287 5150 626162
x31 748 465616 681 482151 811 512690 755 531532 3808 634720 10781 977037 906 469434 28482 645286 5872 589808
Goulburn 5802 905100 10119 961610 22702 1100164 26575 1150343 5720 1469643 5947 2596824 7836 910212 7790 1473656 11561 1320944
SuperFastHash 92655 456617 35260 460586 37506 478081 40716 485802 3798 522539 2284 738865 49772 458939 889 529079 32860 516314
PaulHsieh 92655 454035 35260 478443 37506 471547 40716 483381 3798 532185 2284 742275 49772 446016 889 528183 32860 517008
Crap8 1609 601070 1509 612065 1523 649618 1530 669773 207148 734424 207278 1085805 2971 594502 854 741816 53053 711134
SDBM 1614 564805 1614 606055 1614 652530 1614 670583 19524 791190 46321 1282282 818 557150 464485 799355 67201 740494
CrapWow 2991 565563 2994 591631 2970 639759 2998 656711 16180 741120 826912 1040664 5788 574109 26706 746881 110942 694555
maFastPrime1 116198 481643 135967 494664 134543 500891 136698 509689 240766 522830 242510 671732 16392 487947 26851 527565 131241 524620
maRushPrime1 136030 407643 135913 417737 134587 423622 136385 429057 240786 459925 242490 662676 19447 422639 26889 462150 134066 460681
DEK 275522 564506 281959 584559 280522 678182 298654 704562 273543 849981 642579 1393478 258703 563120 5531 854908 289627 774162
Novak 318361 523420 318361 538935 318361 576770 318361 585848 313060 707727 314373 1081205 452167 516718 4553 706459 294700 654635
XXH_strong32 4987 560930 190106 577575 924509 737312 1141306 802982 581028 855138 128892 1239066 4815 564960 4231 852684 372484 773831
XXH_fast32 4987 574828 190106 586619 924479 706623 1141784 749062 580968 780869 482802 977358 4815 574513 4653 792229 416824 717763
ELF 393367 578255 873256 620363 873256 682341 859060 713633 1026868 900656 1063857 1652210 608155 574831 1272682 907693 871313 828748
PJW-32 393367 597401 873256 636300 873256 714638 859060 738046 1026868 926204 1063857 1729711 608155 592092 1272682 936472 871313 858858
Fletcher 1375277 573604 1005681 591810 1005681 632510 1005682 643749 1684534 755373 1684341 1168538 1329488 573351 2674684 767488 1470671 713303
Adler 2679903 817715 2679903 850693 2679903 928433 2679903 955746 2679903 1079049 2679903 1734044 2679903 811773 2725829 1096280 2685644 1034217

Подсчитаем производительность алгоритмов из прошлого теста. Отсортируем по самым быстрым. Результаты опять же будут тут.

Тест качества функций BCC, Athlon II X4 640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
maRushPrime1 136030 407643 135913 417737 134587 423622 136385 429057 240786 459925 242490 662676 19447 422639 26889 462150 134066 460681
SuperFastHash 92655 456617 35260 460586 37506 478081 40716 485802 3798 522539 2284 738865 49772 458939 889 529079 32860 516314
PaulHsieh 92655 454035 35260 478443 37506 471547 40716 483381 3798 532185 2284 742275 49772 446016 889 528183 32860 517008
maFastPrime1 116198 481643 135967 494664 134543 500891 136698 509689 240766 522830 242510 671732 16392 487947 26851 527565 131241 524620
Murmur3 901 474070 882 485885 852 511794 874 516785 972 561498 1348 825180 933 472959 842 566074 951 551781
SBOX 1533 447508 1531 468539 1508 484687 1515 501030 2818 602248 4919 911811 1528 448451 2325 611906 2210 559523
lookup3 872 489802 880 516491 892 532352 874 539643 863 583700 884 837563 865 492632 911 589214 880 572675
x31 748 465616 681 482151 811 512690 755 531532 3808 634720 10781 977037 906 469434 28482 645286 5872 589808
Murmur2 857 473264 873 490693 846 520631 906 538581 1103 616492 1889 970944 923 484762 873 624191 1034 589945
x17 907 479941 903 494136 693 525659 1043 536593 1712 656054 3546 1006225 711 484909 4409 661099 1741 605577
Murmur2A 850 521611 798 533038 877 556597 848 577397 1120 611878 1364 906513 830 522121 839 626557 941 606964
DJB 840 495315 840 517087 840 569881 840 574197 1591 662806 3463 1030377 738 491342 32051 668287 5150 626162
BKDR 639 503451 639 524770 639 567920 639 579496 1533 663045 3406 1020730 787 497588 4168 670179 1556 628397
FNV 901 498574 901 532511 901 572200 901 580678 4624 667106 9073 1022888 801 492040 3457 670248 2695 629531
Novak 318361 523420 318361 538935 318361 576770 318361 585848 313060 707727 314373 1081205 452167 516718 4553 706459 294700 654635
FNV1 982 512640 982 541733 982 600561 982 610896 2706 721205 5328 1145683 890 518892 1691 726157 1818 672221
LY 862 520911 862 547286 862 606202 862 629063 1615 723546 4631 1145977 792 520102 1645 730173 1516 677908
FNV1a 937 525014 937 554741 937 610337 937 629870 2721 729065 5290 1148294 884 520337 1802 732663 1806 681290
JS 1479 538540 2168 563729 4169 615457 4635 634166 942 738583 944 1159551 1445 533942 1229 757806 2126 692722
CrapWow 2991 565563 2994 591631 2970 639759 2998 656711 16180 741120 826912 1040664 5788 574109 26706 746881 110942 694555
RS 835 541779 860 567362 864 619388 850 632621 1934 741889 8278 1176526 800 537599 5057 750506 2435 695959
Crap8 1609 601070 1509 612065 1523 649618 1530 669773 207148 734424 207278 1085805 2971 594502 854 741816 53053 711134
Fletcher 1375277 573604 1005681 591810 1005681 632510 1005682 643749 1684534 755373 1684341 1168538 1329488 573351 2674684 767488 1470671 713303
XXH_fast32 4987 574828 190106 586619 924479 706623 1141784 749062 580968 780869 482802 977358 4815 574513 4653 792229 416824 717763
ROT13 977 557406 1002 579267 1076 638053 1089 647648 1115 794916 1035 1237511 842 554082 1469 759803 1076 721086
SDBM 1614 564805 1614 606055 1614 652530 1614 670583 19524 791190 46321 1282282 818 557150 464485 799355 67201 740494
maPrime2c 908 570474 817 603024 843 662202 834 677894 852 801734 851 1289177 897 565889 891 806199 862 747074
AP 699 596768 700 611461 685 661567 709 684894 1719 802810 6116 1287297 790 598561 808 813916 1528 757159
XXH_strong32 4987 560930 190106 577575 924509 737312 1141306 802982 581028 855138 128892 1239066 4815 564960 4231 852684 372484 773831
DEK 275522 564506 281959 584559 280522 678182 298654 704562 273543 849981 642579 1393478 258703 563120 5531 854908 289627 774162
faq6 812 600005 812 639768 812 702003 812 728264 877 869339 856 1421989 844 607349 834 877003 832 805715
OneAtTime 812 608546 812 641132 812 710368 812 726712 877 871128 856 1413162 844 603179 834 875666 832 806237
crc32 1155 616384 1155 645086 1155 703019 1155 725574 801 876004 859 1421234 1318 615989 861 890113 1057 811675
ELF 393367 578255 873256 620363 873256 682341 859060 713633 1026868 900656 1063857 1652210 608155 574831 1272682 907693 871313 828748
PJW-32 393367 597401 873256 636300 873256 714638 859060 738046 1026868 926204 1063857 1729711 608155 592092 1272682 936472 871313 858858
Adler 2679903 817715 2679903 850693 2679903 928433 2679903 955746 2679903 1079049 2679903 1734044 2679903 811773 2725829 1096280 2685644 1034217
Goulburn 5802 905100 10119 961610 22702 1100164 26575 1150343 5720 1469643 5947 2596824 7836 910212 7790 1473656 11561 1320944

Один из самых сложных тестов - он и самый простой. Более двух с половиной миллионов чисел, от 0 до 2726298, могут поставить в тупик любой из самых сложных алгоритмов. Проведем испытание скомпилированного на BCC кода, тестовым стендом будет машина на базе Intel Core i3. Результаты отсортируем по колличеству коллизий. Скачать их можно будет вот здесь.

Тест качества функций BCC, I3-2120
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
crc32 1 281484 1 298604 1 406032 1 395069 429 435259 414 770972 1 278971 420 434750 159 412643
LY 1 230886 1 241196 1 279808 1 279079 832 293699 1705 458190 1 230338 855 292094 425 288161
x17 1 243228 1 252084 1 294124 1 293864 839 306163 1652 440136 1 239377 1129 307398 453 297047
AP 307 274879 394 287449 393 336714 395 392039 404 377583 879 608874 443 273182 410 381334 453 366507
BKDR 1 225542 1 234478 1 288942 1 269785 869 276304 1717 392207 1 226462 1130 313345 465 278383
Murmur2 416 241360 799 256763 877 277197 836 295143 867 306007 1154 433666 300 240514 820 310016 759 295083
maPrime2c 831 263166 861 277203 842 315128 899 335116 868 356492 853 526792 802 261637 914 350613 859 335768
lookup3 848 321006 878 293667 872 315120 881 302966 899 343761 824 442252 860 325348 858 347407 865 336441
Murmur3 849 274891 933 323145 837 307538 890 306904 806 324478 1050 413998 836 269892 836 323004 880 317981
Murmur2A 819 279951 823 285946 802 309737 888 325224 834 352055 1133 415547 888 279040 894 339117 885 323327
RS 446 236426 447 249011 388 273342 418 289165 837 298736 6624 448891 411 236601 1341 315789 1364 293495
FNV1 463 236219 463 243401 463 280614 463 286970 2283 302853 4772 464467 864 234723 1801 342808 1447 299007
FNV1a 737 236299 737 246034 737 276979 737 288211 2327 308838 4640 504493 706 237747 1762 304241 1548 300355
OneAtTime 1895 287712 1895 305852 1895 371945 1895 388964 906 432704 877 685794 2549 287541 909 420764 1603 397660
faq6 1895 288439 1895 305184 1895 367311 1895 394198 906 419025 877 694809 2549 292460 909 421320 1603 397843
maFastPrime1 492 266065 449 250223 313 283945 369 280489 817 279791 2126 335857 1581 261936 9228 275889 1922 279274
Crap8 1135 340610 1051 334655 1072 393813 1086 386580 4761 425691 4994 549387 1380 341931 813 471657 2037 405541
maRushPrime1 237 214525 1 218657 1429 232175 170 236307 895 242854 2110 290412 2188 239234 9348 236750 2047 238864
SBOX 1471 239201 1546 246222 1540 270233 1497 278357 2644 287322 4822 372064 1466 239402 2313 286431 2162 277404
FNV 1493 224454 1493 232316 1493 253959 1493 264773 3917 274700 7799 420623 662 224336 3572 300243 2740 274426
Goulburn 5416 491006 9584 541409 22219 724572 26388 768523 5656 848204 5609 1580318 6238 492045 6490 850259 10950 787042
JS 17935 262367 18821 273654 20735 318244 21220 333909 921 362379 915 574438 14196 259579 1054 362405 11975 343372
XXH_strong32 273 295686 392 309258 423 346698 299 351226 422 367369 758 597963 28670 295846 68522 363980 12470 366003
XXH_fast32 273 293952 392 308632 423 333457 299 352059 422 366364 806 572579 28670 307758 68522 365518 12476 362540
DEK 1 258240 1 272820 1 333265 1 346306 154 356776 1 554242 290519 257249 41 352684 36340 341448
ROT13 56172 280307 56172 303392 56191 342516 56204 373679 40602 395720 29848 614665 21523 278444 1881 396257 39824 373123
x31 1 242268 1 251901 1 276943 1 289960 53711 307238 174138 438039 1 242538 402997 309260 78856 294768
CrapWow 845 333925 855 329680 859 382761 903 377792 910 413279 576575 531256 875 333969 421939 487067 125470 398716
DJB 1 233296 1 245772 1 273819 1 289814 895 300363 1715 450162 1 234735 1214545 303579 152145 291443
PaulHsieh 1302258 241401 385693 249513 384715 288145 384721 272189 154769 281311 11500 351138 298120 240642 1150 285397 365366 276217
SuperFastHash 1302258 243324 385693 252072 384715 265945 384721 275858 154769 289449 11500 374725 298120 243775 1150 283089 365366 278530
SDBM 1 269016 1 285219 1 373262 1 360182 269854 396101 636088 635117 1 268796 2389609 388792 411945 372061
ELF 1 253002 1359899 269207 1359899 364857 1043099 350112 1162285 393487 2336423 695786 142631 251012 2672745 394391 1259623 371482
PJW-32 1 290217 1359899 303675 1359899 353846 1043099 391752 1162285 413113 2336423 668734 142631 283431 2672745 451622 1259623 394549
Novak 2562948 256027 2562948 264659 2562948 314723 2562948 315047 2507396 327686 2507342 486209 2570635 257641 292644 330252 2266226 319031
Fletcher 2603160 276928 2431144 291762 2431144 323186 2431144 342780 2574298 357315 2574299 517699 2592294 276871 2717699 355488 2544398 342754
Adler 2717856 322645 2717856 339280 2717856 408723 2717856 441705 2717856 469029 2717856 736074 2717856 321369 2726054 455686 2718881 436814

Ну, а теперь осталось взглянуть на производительность данных функций на прошлом тестовом. Отсортируем результаты по затраченному времени. От меньшего к большего, естественно. Скачать таблицу в электронном видем сможем прямо здесь.

Тест скорости функций BCC, I3-2120
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
maRushPrime1 237 214525 1 218657 1429 232175 170 236307 895 242854 2110 290412 2188 239234 9348 236750 2047 238864
FNV 1493 224454 1493 232316 1493 253959 1493 264773 3917 274700 7799 420623 662 224336 3572 300243 2740 274426
PaulHsieh 1302258 241401 385693 249513 384715 288145 384721 272189 154769 281311 11500 351138 298120 240642 1150 285397 365366 276217
SBOX 1471 239201 1546 246222 1540 270233 1497 278357 2644 287322 4822 372064 1466 239402 2313 286431 2162 277404
BKDR 1 225542 1 234478 1 288942 1 269785 869 276304 1717 392207 1 226462 1130 313345 465 278383
SuperFastHash 1302258 243324 385693 252072 384715 265945 384721 275858 154769 289449 11500 374725 298120 243775 1150 283089 365366 278530
maFastPrime1 492 266065 449 250223 313 283945 369 280489 817 279791 2126 335857 1581 261936 9228 275889 1922 279274
LY 1 230886 1 241196 1 279808 1 279079 832 293699 1705 458190 1 230338 855 292094 425 288161
DJB 1 233296 1 245772 1 273819 1 289814 895 300363 1715 450162 1 234735 1214545 303579 152145 291443
RS 446 236426 447 249011 388 273342 418 289165 837 298736 6624 448891 411 236601 1341 315789 1364 293495
x31 1 242268 1 251901 1 276943 1 289960 53711 307238 174138 438039 1 242538 402997 309260 78856 294768
Murmur2 416 241360 799 256763 877 277197 836 295143 867 306007 1154 433666 300 240514 820 310016 759 295083
x17 1 243228 1 252084 1 294124 1 293864 839 306163 1652 440136 1 239377 1129 307398 453 297047
FNV1 463 236219 463 243401 463 280614 463 286970 2283 302853 4772 464467 864 234723 1801 342808 1447 299007
FNV1a 737 236299 737 246034 737 276979 737 288211 2327 308838 4640 504493 706 237747 1762 304241 1548 300355
Murmur3 849 274891 933 323145 837 307538 890 306904 806 324478 1050 413998 836 269892 836 323004 880 317981
Novak 2562948 256027 2562948 264659 2562948 314723 2562948 315047 2507396 327686 2507342 486209 2570635 257641 292644 330252 2266226 319031
Murmur2A 819 279951 823 285946 802 309737 888 325224 834 352055 1133 415547 888 279040 894 339117 885 323327
maPrime2c 831 263166 861 277203 842 315128 899 335116 868 356492 853 526792 802 261637 914 350613 859 335768
lookup3 848 321006 878 293667 872 315120 881 302966 899 343761 824 442252 860 325348 858 347407 865 336441
DEK 1 258240 1 272820 1 333265 1 346306 154 356776 1 554242 290519 257249 41 352684 36340 341448
Fletcher 2603160 276928 2431144 291762 2431144 323186 2431144 342780 2574298 357315 2574299 517699 2592294 276871 2717699 355488 2544398 342754
JS 17935 262367 18821 273654 20735 318244 21220 333909 921 362379 915 574438 14196 259579 1054 362405 11975 343372
XXH_fast32 273 293952 392 308632 423 333457 299 352059 422 366364 806 572579 28670 307758 68522 365518 12476 362540
XXH_strong32 273 295686 392 309258 423 346698 299 351226 422 367369 758 597963 28670 295846 68522 363980 12470 366003
AP 307 274879 394 287449 393 336714 395 392039 404 377583 879 608874 443 273182 410 381334 453 366507
ELF 1 253002 1359899 269207 1359899 364857 1043099 350112 1162285 393487 2336423 695786 142631 251012 2672745 394391 1259623 371482
SDBM 1 269016 1 285219 1 373262 1 360182 269854 396101 636088 635117 1 268796 2389609 388792 411945 372061
ROT13 56172 280307 56172 303392 56191 342516 56204 373679 40602 395720 29848 614665 21523 278444 1881 396257 39824 373123
PJW-32 1 290217 1359899 303675 1359899 353846 1043099 391752 1162285 413113 2336423 668734 142631 283431 2672745 451622 1259623 394549
OneAtTime 1895 287712 1895 305852 1895 371945 1895 388964 906 432704 877 685794 2549 287541 909 420764 1603 397660
faq6 1895 288439 1895 305184 1895 367311 1895 394198 906 419025 877 694809 2549 292460 909 421320 1603 397843
CrapWow 845 333925 855 329680 859 382761 903 377792 910 413279 576575 531256 875 333969 421939 487067 125470 398716
Crap8 1135 340610 1051 334655 1072 393813 1086 386580 4761 425691 4994 549387 1380 341931 813 471657 2037 405541
crc32 1 281484 1 298604 1 406032 1 395069 429 435259 414 770972 1 278971 420 434750 159 412643
Adler 2717856 322645 2717856 339280 2717856 408723 2717856 441705 2717856 469029 2717856 736074 2717856 321369 2726054 455686 2718881 436814
Goulburn 5416 491006 9584 541409 22219 724572 26388 768523 5656 848204 5609 1580318 6238 492045 6490 850259 10950 787042

Теперь проведем еще и специальный, расширенный тест наших функций с участием новичка. Впервые будет включен и алгоритм от Google - CityHash32. Известно, что семейсво CityHash, во-первых, оптимально для 64-разрядных платформ, а во-вторых - требует поддержки SSE4.2 со стороны компилятора, со стороны целевой платформы, понятное дело. В противном случае производительность будет далека от идеала. Именно сложная конструкция, зависимость от ряда специфичных инструкций - это отличает CityHash32 от MaPrime, MaFastPrime и MaRushPrime. Да, конструкция CityHash довольно хорошо продумана, но она крайне сложна для понимания. Ребята серьезно поработали над MurmurHash, создав данный алгоритм. В итоге - хорошие статистические показатели, низкое число коллизий. Но скорость? Посмотрим, что у нас будет со скоростью. Напомним, что все участники теста в нашем случае не оптизированы "вручную", а реализованы согласно типовым имплементациям на языке C. Что качасается CityHash, то он изначально задуман под C++, использует некоторые специфичные функции. Те же MaPrime или FNV можно записать несколькими строчками кода, а под CityHash лучше выделить отдельный файл с исходником. Массивный объем кода в оригинальной записи, без ручной оптимизации под конкретный компилятор вероято не порадует своей резвостью. Да, но мы никого не оптимизировали для чистоты эксперимента. Хорошо, для начала, все же, отсортируем результаты испытания по колличеству коллизий. О самом тесте: всего 22202987 строк в западноевропейском подмножестве символов (заголовки из различных словарей и энциклопедий), компилятор - BCC, оптимизация по скорости. Результаты можно найти здесь.

Тест качества функций BCC, AMD-640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
CityHash32 56695 9157642 55927 9643783 54312 11032658 53034 11516558 35266 13301219 44412 20215332 56473 9358538 35472 13285900 48949 12188954
lookup3 57380 4444995 57238 4533239 57468 4777320 56972 4843473 57464 5288996 57133 7089310 57141 4498828 57174 5326841 57246 5100375
maPrime2c 57678 4983646 57225 5152921 57424 5778068 57307 5915846 57490 6765964 57260 9849889 57947 4990581 57182 6794037 57439 6278869
crc32 58277 5334268 58277 5707858 58277 6196485 58277 6333024 56240 7364236 56476 10900771 56752 5398795 60058 7286619 57829 6815257
Murmur2A 57663 4821756 57751 4901020 57378 5041230 57487 5174873 63368 5666418 72140 7419877 57190 4861569 57464 5675115 60055 5445232
faq6 64359 5290582 64359 5404432 64359 6064411 64359 6258925 57219 7226714 56945 10771881 64632 5304799 57356 7287248 61699 6701124
OneAtTime 64359 5299257 64359 5509840 64359 6132057 64359 6308572 57219 7288634 56945 10833969 64632 5303328 57356 7267645 61699 6742913
Murmur2 56780 4342494 56873 4457520 56792 4839515 57169 4901600 74485 5652135 127682 7779621 56395 4452437 56995 5733762 67896 5269886
ROT13 61868 4863765 63611 4779927 68985 5352874 70811 5517474 71154 6286636 62834 9022672 61660 4764490 96279 6374273 69650 5870264
Murmur3 57202 4490468 57496 4536758 57389 4731674 57443 4785129 98563 5275259 118662 6879735 57119 4501561 57542 5288230 70177 5061102
maFastPrime1 63790 4510869 64202 4522029 63876 4673488 64159 4704717 128477 4947560 222153 5636413 65220 4568473 59194 4996188 91384 4819967
LY 56353 4668657 56353 4807890 56353 5297102 56353 5412751 114920 6177462 228415 8805069 56207 4623472 113798 6175102 92344 5745938
AP 56251 5442888 56377 5589105 56253 6152439 56224 6312955 96402 7378886 306858 11128019 56487 5526986 56884 7429461 92717 6870092
maRushPrime1 69949 3918751 65607 4059170 72628 4141735 63965 4167996 128130 4509983 221696 5568369 69798 3965593 58963 4585894 93842 4364686
BKDR 57407 4506484 57407 4659605 57407 5077214 57407 5160715 113433 5767876 226079 7946431 56642 4528439 136131 5788202 95239 5429371
Crap8 57435 5343245 57750 5394526 57886 5739395 57519 5812771 231297 6467258 238174 8911924 57727 5341497 57187 6498177 101872 6188599
FNV1a 56498 4647550 56498 4833294 56498 5357808 56498 5471950 169737 6220538 336958 8871423 56379 4670949 114500 6256374 112946 5791236
FNV1 57297 4880932 57297 5050408 57297 5596907 57297 5609097 169317 6403177 337301 8955546 57090 4750659 115325 6259519 113528 5938281
x31 57482 4231647 56347 4332221 55866 4701370 57827 4820374 158607 5453084 316041 7421842 57430 4283032 253184 5519937 126598 5095438
JS 97072 4778601 139762 4955386 265358 5470604 302489 5605912 60009 6346009 59606 8994218 95863 4956268 59629 6419098 134974 5940762
SBOX 101789 4216170 102119 4349619 101752 4642281 101820 4778388 180945 5424843 323820 7198494 102272 4208200 151816 5507657 145792 5040707
DJB 57323 4441474 57323 4591050 57323 5031054 57323 5138843 112639 5724464 225330 7884705 57848 4448753 638361 5751107 157934 5376431
FNV 57921 4446241 57921 4582822 57921 5038792 57921 5170994 297598 5809198 587497 7948148 57253 4456007 228855 5805523 175361 5407216
RS 56552 5093239 56771 5221283 56599 5768846 56493 6006458 135299 6911643 599969 9743789 57059 5124350 428590 6767038 180917 6329581
PaulHsieh 332726 4196142 236615 4184832 232988 4365635 232055 4420505 123104 4892745 112439 6227952 308140 4160330 62882 4935337 205119 4672935
SuperFastHash 332726 4373956 236615 4393874 232988 4668238 232055 4743935 123104 4977834 112439 6202872 308140 4448735 62882 5006616 205119 4852008
XXH_strong32 157274 5164012 172216 5349630 494332 5932243 559006 6112106 1282583 7066830 1216796 9653287 132186 5227052 68316 7077587 510339 6447843
XXH_fast32 157001 5196848 172195 5277771 494363 5797884 559438 5951314 1283654 6653974 1287949 8173387 132403 5157777 68101 6667269 519388 6109528
Goulburn 359797 7309826 631282 7697663 1406050 8961924 1647756 9349052 360404 11436377 358296 19044162 354955 7356981 354051 11411577 684074 10320945
x17 815841 4398650 803067 4523875 802380 4937491 803702 5052488 856824 5794445 961896 7856824 774186 4442900 134740 5818002 744080 5353084
DEK 351553 4660217 376376 4843183 348570 5338540 351477 5468119 1021243 6239365 4446280 8839063 372797 4689965 135887 6247895 925523 5790793
SDBM 56139 4929339 56139 5102168 56139 5670296 56139 5834136 945322 6671188 1805990 9767296 57043 4939497 5724566 6696635 1094685 6201319
CrapWow 59910 5018009 60082 5118645 60222 5475647 59803 5573433 3431433 6275085 5781762 8513698 60423 5034017 152979 6282078 1208327 5911327
ELF 2484724 5249008 10831309 5351961 10831309 5962402 10843269 6164292 7274933 7394244 9147162 12291305 2369305 5312132 2887242 7456085 7083657 6897679
PJW-32 2484724 5363830 10831309 5306078 10831309 5946072 10843269 6292461 7274933 7493147 9147162 12564357 2369305 5500470 2887242 7563301 7083657 7003715
Fletcher 6049256 5100163 2280147 5154600 2280269 5567256 2293526 5719849 8693373 6527707 8689016 9059061 6398271 5198212 21460413 6617726 7268034 6118072
Novak 9845389 4743282 9845389 4803200 9845389 5197660 9845389 5409606 9379772 6140278 9423276 8476912 9793173 4674169 917912 6171681 8611961 5702099
Adler 20971797 6802291 20971797 7093744 20971797 7815261 20971797 8037045 20971765 9240934 20971765 13763422 20971802 6859224 22193986 9281151 21124563 8611634

Тот же тест, но результаты отсортируем по производительности функций. От самых быстрых - к более медленным. А сам исходный материл смотрите тут.

Тест скорости функций BCC, AMD-640
Алгоритм Коллизии A Время A Коллизии B Время B Коллизии C Время C Коллизии D Время D Коллизии E Время E Коллизии F Время F Коллизии G Время G Коллизии H Время H Коллизии Среднее Время Среднее
maRushPrime1 69949 3918751 65607 4059170 72628 4141735 63965 4167996 128130 4509983 221696 5568369 69798 3965593 58963 4585894 93842 4364686
PaulHsieh 332726 4196142 236615 4184832 232988 4365635 232055 4420505 123104 4892745 112439 6227952 308140 4160330 62882 4935337 205119 4672935
maFastPrime1 63790 4510869 64202 4522029 63876 4673488 64159 4704717 128477 4947560 222153 5636413 65220 4568473 59194 4996188 91384 4819967
SuperFastHash 332726 4373956 236615 4393874 232988 4668238 232055 4743935 123104 4977834 112439 6202872 308140 4448735 62882 5006616 205119 4852008
SBOX 101789 4216170 102119 4349619 101752 4642281 101820 4778388 180945 5424843 323820 7198494 102272 4208200 151816 5507657 145792 5040707
Murmur3 57202 4490468 57496 4536758 57389 4731674 57443 4785129 98563 5275259 118662 6879735 57119 4501561 57542 5288230 70177 5061102
x31 57482 4231647 56347 4332221 55866 4701370 57827 4820374 158607 5453084 316041 7421842 57430 4283032 253184 5519937 126598 5095438
lookup3 57380 4444995 57238 4533239 57468 4777320 56972 4843473 57464 5288996 57133 7089310 57141 4498828 57174 5326841 57246 5100375
Murmur2 56780 4342494 56873 4457520 56792 4839515 57169 4901600 74485 5652135 127682 7779621 56395 4452437 56995 5733762 67896 5269886
x17 815841 4398650 803067 4523875 802380 4937491 803702 5052488 856824 5794445 961896 7856824 774186 4442900 134740 5818002 744080 5353084
DJB 57323 4441474 57323 4591050 57323 5031054 57323 5138843 112639 5724464 225330 7884705 57848 4448753 638361 5751107 157934 5376431
FNV 57921 4446241 57921 4582822 57921 5038792 57921 5170994 297598 5809198 587497 7948148 57253 4456007 228855 5805523 175361 5407216
BKDR 57407 4506484 57407 4659605 57407 5077214 57407 5160715 113433 5767876 226079 7946431 56642 4528439 136131 5788202 95239 5429371
Murmur2A 57663 4821756 57751 4901020 57378 5041230 57487 5174873 63368 5666418 72140 7419877 57190 4861569 57464 5675115 60055 5445232
Novak 9845389 4743282 9845389 4803200 9845389 5197660 9845389 5409606 9379772 6140278 9423276 8476912 9793173 4674169 917912 6171681 8611961 5702099
LY 56353 4668657 56353 4807890 56353 5297102 56353 5412751 114920 6177462 228415 8805069 56207 4623472 113798 6175102 92344 5745938
DEK 351553 4660217 376376 4843183 348570 5338540 351477 5468119 1021243 6239365 4446280 8839063 372797 4689965 135887 6247895 925523 5790793
FNV1a 56498 4647550 56498 4833294 56498 5357808 56498 5471950 169737 6220538 336958 8871423 56379 4670949 114500 6256374 112946 5791236
ROT13 61868 4863765 63611 4779927 68985 5352874 70811 5517474 71154 6286636 62834 9022672 61660 4764490 96279 6374273 69650 5870264
CrapWow 59910 5018009 60082 5118645 60222 5475647 59803 5573433 3431433 6275085 5781762 8513698 60423 5034017 152979 6282078 1208327 5911327
FNV1 57297 4880932 57297 5050408 57297 5596907 57297 5609097 169317 6403177 337301 8955546 57090 4750659 115325 6259519 113528 5938281
JS 97072 4778601 139762 4955386 265358 5470604 302489 5605912 60009 6346009 59606 8994218 95863 4956268 59629 6419098 134974 5940762
XXH_fast32 157001 5196848 172195 5277771 494363 5797884 559438 5951314 1283654 6653974 1287949 8173387 132403 5157777 68101 6667269 519388 6109528
Fletcher 6049256 5100163 2280147 5154600 2280269 5567256 2293526 5719849 8693373 6527707 8689016 9059061 6398271 5198212 21460413 6617726 7268034 6118072
Crap8 57435 5343245 57750 5394526 57886 5739395 57519 5812771 231297 6467258 238174 8911924 57727 5341497 57187 6498177 101872 6188599
SDBM 56139 4929339 56139 5102168 56139 5670296 56139 5834136 945322 6671188 1805990 9767296 57043 4939497 5724566 6696635 1094685 6201319
maPrime2c 57678 4983646 57225 5152921 57424 5778068 57307 5915846 57490 6765964 57260 9849889 57947 4990581 57182 6794037 57439 6278869
RS 56552 5093239 56771 5221283 56599 5768846 56493 6006458 135299 6911643 599969 9743789 57059 5124350 428590 6767038 180917 6329581
XXH_strong32 157274 5164012 172216 5349630 494332 5932243 559006 6112106 1282583 7066830 1216796 9653287 132186 5227052 68316 7077587 510339 6447843
faq6 64359 5290582 64359 5404432 64359 6064411 64359 6258925 57219 7226714 56945 10771881 64632 5304799 57356 7287248 61699 6701124
OneAtTime 64359 5299257 64359 5509840 64359 6132057 64359 6308572 57219 7288634 56945 10833969 64632 5303328 57356 7267645 61699 6742913
crc32 58277 5334268 58277 5707858 58277 6196485 58277 6333024 56240 7364236 56476 10900771 56752 5398795 60058 7286619 57829 6815257
AP 56251 5442888 56377 5589105 56253 6152439 56224 6312955 96402 7378886 306858 11128019 56487 5526986 56884 7429461 92717 6870092
ELF 2484724 5249008 10831309 5351961 10831309 5962402 10843269 6164292 7274933 7394244 9147162 12291305 2369305 5312132 2887242 7456085 7083657 6897679
PJW-32 2484724 5363830 10831309 5306078 10831309 5946072 10843269 6292461 7274933 7493147 9147162 12564357 2369305 5500470 2887242 7563301 7083657 7003715
Adler 20971797 6802291 20971797 7093744 20971797 7815261 20971797 8037045 20971765 9240934 20971765 13763422 20971802 6859224 22193986 9281151 21124563 8611634
Goulburn 359797 7309826 631282 7697663 1406050 8961924 1647756 9349052 360404 11436377 358296 19044162 354955 7356981 354051 11411577 684074 10320945
CityHash32 56695 9157642 55927 9643783 54312 11032658 53034 11516558 35266 13301219 44412 20215332 56473 9358538 35472 13285900 48949 12188954

Можно ли делать выводы на основе вышепроведенных тестов? Скептики скажут, что перечень информации не полон и говорить что-то однозначно - довольно рискованно. Они будут правы. Если мы посмотрим на материалы - исследования различных независимых экспертов, результы их деятельности могут разнится. А почему? Все потому, что тот же алгоритм может давать практически идеальные результаты на одном наборе данных, а сыпаться - на другом. И далеко не всегда удается вычленить такой вот "нехороший" исходный материал. В нашем тесте были использованы самые разные наборы, включающие более двух миллионов строк. Помимо этого проводились подтесты, уложняющие основные испытания. Как вы уже заметили, к основному материалу добавлялись модификации от B до H, тоесть всего мы имели 8 вариантов каждого теста, и каждая вариация испытавала алгоритмы на те или иные слабые места. Что характерно, в качестве итогового испытания у нас применяется подход "среднее значение", включающее среднее арифметическое по тесту. Другими словами, вычисляем лидера, стабильного лидера, а не смотрим на показатель по одному "забегу".

Однозначно, приветствуются другие испытания. Если у вас есть своя тестовая батарея - замеряйте время, вычисляйте число коллизий. Как показали наши испытания - MaPrime2c отличается высокой стабильностью и отсутствием провалов, но не блещет поизводительностью. Впрочем, оная далеко не всегда на первом месте стоит среди требований к алгоритму. Что касается функций FastPrime1 и RushPrime1, эти товарищи отличаются очень хорошей скоростью работы на кратных 32-битам строках, хорошей скоростью на прочих наборах и далеко не худшими показателями распределения. Среди конкурентых преимуществ всех трех алгоритмов - простота конструкции, возможность реализации в аппаратных решениях, отличная переносимость между языками программирования и платформами. Именно поэтому только нашему читателю (инженеру, ученому, исследователю) самому придется решать, кто же победил и кто победит в дальнейшем в нелегком соревновании, которое можно окрестить в популярной ныне стилистике MaPrime2c vs FNV, MaPrime2c vs CityHash и так далее.

Исходники тестовой батареи доступны здесь. Вы всегда сможете провести тестирование на своем собственном оборудовании и, при необходимости, на своем тестовом материале. Набор исходных слованых данных, применяемых во втором разделе тестирования можно получить по этой ссылке. Если у вас есть вопросы, пишите письма на amsoftware at yandex.by


Используются технологии uCoz