La siguiente tabla resume el rendimiento de las diversas funciones hash descritas anteriormente, para tres conjuntos de datos:
1) Todas las palabras y frases con entradas en el 2.º diccionario internacional íntegro de Merriam-Webster (311.141 cadenas, longitud media 10 caracteres).
2) Todas las cadenas en / bin / , / usr / bin / , / usr / lib / , / usr / ucb /
y / usr / openwin / bin / * (66,304 cadenas, longitud promedio 21 caracteres).
3) Una lista de URL recopiladas por un rastreador web que se ejecutó durante varias horas anoche (28.372 cadenas, longitud promedio de 49 caracteres).
La métrica de rendimiento que se muestra en la tabla es el "tamaño promedio de la cadena" sobre todos los elementos en la tabla hash (es decir, el valor esperado del número de claves se compara para buscar un elemento).
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
Mirando esta tabla, está claro que todas las funciones, excepto la función Java actual y las dos versiones rotas de la función de Weinberger, ofrecen un rendimiento excelente, casi indistinguible. Supongo que este rendimiento es esencialmente el "ideal teórico", que es lo que obtendría si utilizara un verdadero generador de números aleatorios en lugar de una función hash.
Descartaría la función WAIS ya que su especificación contiene páginas de números aleatorios, y su rendimiento no es mejor que cualquiera de las funciones mucho más simples. Cualquiera de las seis funciones restantes parecen excelentes opciones, pero tenemos que elegir una. Supongo que descartaría la variante de Vo y la función de Weinberger debido a su complejidad añadida, aunque menor. De los cuatro restantes, probablemente seleccionaría P (31), ya que es el más barato para calcular en una máquina RISC (porque 31 es la diferencia de dos potencias de dos). P (33) es igualmente barato de calcular, pero su rendimiento es marginalmente peor, y 33 es compuesto, lo que me pone un poco nervioso.
Josh