В таблице ниже приведены характеристики различных хэш функций, описанных выше, для трех наборов данных:
1) Все слова и фразы с записями в Merriam-Webster's 2-й международный словарь без словаря (311,141 строки, средняя длина 10 символов).
2) Все строки в/bin/,/USR/бен/,/USR/Lib/,/USR/UCB/ и/USR/openwin/bin/* (66,304 строк, avg длиной 21 символ).
3) Список URL-адресов, собранных веб-гусеничным аппаратом, который выполнялся в течение нескольких дней часов прошлой ночью (28 372 строки, средняя длина 49 символов).
Метрика производительности показано в таблице, представляет собой «средний размер цепь» по всем элементам в хэш-таблице (т.е., ожидаемое значение числа ключа сравнивает смотреть вверх элемент).
Webster's Code Strings URLs
--------- ------------ ----
Current Java Fn. 1.2509 1.2738 13.2560
P(37) [Java] 1.2508 1.2481 1.2454
P(65599) [Aho et al] 1.2490 1.2510 1.2450
P(31) [K+R] 1.2500 1.2488 1.2425
P(33) [Torek] 1.2500 1.2500 1.2453
Vo's Fn 1.2487 1.2471 1.2462
WAIS Fn 1.2497 1.2519 1.2452
Weinberger's Fn(MatPak) 6.5169 7.2142 30.6864
Weinberger's Fn(24) 1.3222 1.2791 1.9732
Weinberger's Fn(28) 1.2530 1.2506 1.2439
Глядя на эту таблицу, то становится ясно, что все функции для текущей функции Java и две сломанные версии функции предложения Вайнбергера отлично, почти неотличимы производительности за исключением. I настоятельно полагают, что эта работа по существу является «теоретическим идеалом» , что и было бы тем, что вы получили бы, если бы вместо хэш-функции использовался случайный генератор чисел .
Я бы исключил функцию WAIS, так как ее спецификация содержит страницы случайных чисел, а ее производительность не лучше, чем любая из гораздо более простых функций. Любая из оставшихся шести функций выглядит как отличный выбор, но мы должны выбрать один. Полагаю, я бы исключил вариант Vo и функцию Вайнбергера из-за их сложности , хотя и незначительной. Из оставшихся четырех я бы выбрал P (31), так как он самый дешевый для расчета на машине RISC (потому что 31 - это разница двух степеней двух). P (33) так же дешев до , но его производительность незначительно хуже, а 33 - , что делает меня немного нервным.
Джош
Сравните также http://stackoverflow.com/questions/1835976/what-is-a-sensible-prime-for-hashcode-calculation - Я думаю, что 31 является плохим выбором, если вы пишете ваши собственные функции hashCode. – 2010-05-19 14:50:31
Если бы это было 29, или 37, или даже 97, вы бы спросили: «Почему не 31?» – EJP 2017-07-13 00:32:47
@ EJP важно знать причину выбора нет. если число не является результатом трюка с черной магией. – 2017-09-05 13:08:58