La tabella seguente riassume le prestazioni delle varie funzioni hash descritte sopra, per tre set di dati:
1) Tutte le parole e le frasi con le voci nel 2 ° Dizionario integrale internazionale di Merriam-Webster (311.141 stringhe, lunghezza media 10 caratteri).
2) Tutte le stringhe in / bin / , / usr / bin / , / usr / lib / , / usr / ucb /
e / usr / openwin / bin / * (66.304 stringhe, lunghezza media di 21 caratteri).
3) Un elenco di URL raccolti da un web crawler che ha funzionato per diverse ore ieri sera (28.372 stringhe, lunghezza media 49 caratteri).
La metrica delle prestazioni mostrata nella tabella è la "dimensione media della catena" su tutti gli elementi nella tabella hash (ovvero, il valore atteso del numero di chiave viene confrontato per cercare 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
Guardando questa tabella, è chiaro che tutte le funzioni ad eccezione della funzione Java corrente e le due versioni rotte della funzione di Weinberger offrono prestazioni eccellenti, quasi indistinguibili. Immagino fortemente che questa prestazione sia essenzialmente l '"ideale teorico", che è quello che otterresti se tu usassi un vero generatore di numeri casuali al posto di una funzione hash.
Escluderei la funzione WAIS poiché le sue specifiche contengono pagine di numeri casuali e le sue prestazioni non sono migliori di nessuna delle funzioni molto più semplici. Qualsiasi delle restanti sei funzioni sembrano scelte eccellenti, ma dobbiamo sceglierne una. Suppongo che escluderei la variante di Vo e la funzione di Weinberger a causa della loro maggiore complessità, sebbene minore. Dei restanti quattro, probabilmente selezionerei P (31), poiché è il più economico da calcolare su una macchina RISC (perché 31 è la differenza di due potenze di due). P (33) è altrettanto economico da calcolare, ma le sue prestazioni sono leggermente peggiori e 33 è composito, il che mi rende un po 'nervoso.
Josh