У таблиці нижче наведено ефективність різних хеш-функцій, описаних вище, для трьох наборів даних:
1) Усі слова та фрази із записами у 2-му міжнародному слові Мерріам-Вебстер (311,141 рядки, середня довжина 10 символів).
2) Усі рядки в / bin / , / usr / bin / , / usr / lib / , / usr / ucb /
та / usr / openwin / bin / * (66,304 рядків, середня довжина 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 та двох розбитих версій функції Вайнбергера, мають чудову, майже нерозрізнену продуктивність. Я напевно здогадуюсь, що ця ефективність є по суті "теоретичним ідеалом", що ви отримаєте, якби замість хеш-функції використали справжній генератор випадкових чисел.
Я би виключав функцію WAIS, оскільки її специфікація містить сторінки випадкових чисел, а її продуктивність не краща за будь-яку з набагато простіших функцій. Будь-яка з решти шести функцій здається чудовим вибором, але ми повинні вибрати одну. Я вважаю, що я би виключив варіант Во та функцію Вайнбергера через їх додаткову складність, хоч і незначну. З решти чотирьох я, мабуть, обрав би P (31), оскільки це найдешевший підрахунок на машині RISC (адже 31 - різниця двох потужностей двох). P (33) аналогічно дешевий для обчислення, але його продуктивність незначно гірша, а 33 - композитний, що робить мене трохи нервовим.
Джош