A tabela abaixo resume o desempenho das várias funções de hash descritas acima, para três conjuntos de dados:
1) Todas as palavras e frases com entradas no 2º Dicionário Livre Internacional da Merriam-Webster (311.141 cordas, comprimento médio de 10 caracteres).
2) Todas as strings em / bin / , / usr / bin / , / usr / lib / , / usr / ucb /
e / usr / openwin / bin / * (66.304 strings, com comprimento médio de 21 caracteres).
3) Uma lista de URLs reunidos por um rastreador da Web que funcionou por várias horas na noite passada (28.372 strings, com comprimento médio de 49 caracteres).
A métrica de desempenho mostrada na tabela é o "tamanho médio da cadeia" em todos os elementos da tabela de hash (ou seja, o valor esperado do número de chaves se compara à procura de um 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
Olhando para esta tabela, fica claro que todas as funções, exceto a atual função Java e as duas versões quebradas da função de Weinberger, oferecem desempenho excelente, quase indistinguível. Suponho firmemente que esse desempenho é essencialmente o "ideal teórico", que é o que você obteria se usasse um gerador de números aleatórios verdadeiro no lugar de uma função hash.
Eu descartaria a função WAIS, pois sua especificação contém páginas de números aleatórios e seu desempenho não é melhor do que qualquer uma das funções muito mais simples. Qualquer uma das seis funções restantes parece ser uma excelente opção, mas precisamos escolher uma. Suponho que descartar a variante de Vo e a função de Weinberger por causa de sua complexidade adicional, embora menor. Dos quatro restantes, eu provavelmente selecionaria P (31), pois é o mais barato para calcular em uma máquina RISC (porque 31 é a diferença de duas potências de duas). P (33) é igualmente barato de calcular, mas seu desempenho é marginalmente pior e 33 é composto, o que me deixa um pouco nervoso.
Josh