Originariamente inviato da MItaly
All'atto pratico sì.
La funzione di hash mappa tutti i possibili valori delle chiavi degli elementi che deve contenere in indici nella tabella in questione. In un mondo ideale, la tabella di hash sarebbe di dimensioni infinite, per ogni chiave la funzione di hash computerebbe un valore univoco, e quindi in ogni "posto" della tabella ci si farebbe stare un solo elemento.
Tuttavia le tabelle di hash nella realtà hanno dimensioni limitate, e le funzioni di hash possono produrre valori uguali per chiavi diverse. Per questo si fa in modo che in ogni "casella" della tabella di hash, invece di starci un elemento, ci sta una linked list di elementi, che contiene tutti gli elementi dal medesimo hash.
Quando si deve cercare qualcosa in una tabella di hash, si computa l'hash della chiave, si va alla relativa "casella" nella tabella di hash e si scorre la linked list finché non si trova l'elemento cercato (confrontando la chiave cercata con quella degli elementi presenti nella linked list in questione).
In questa maniera, la complessità dell'operazione tende a quella dell'array nei casi migliori (tutti elementi con hash diversi), dato che per localizzare la "casella" della tabella basta computare la funzione di hash e saltare al relativo indirizzo di memoria (O(1)), e, nel caso peggiore in assoluto (tutti gli elementi hanno lo stesso hash), raggiunge la complessità della linked list (O(N)), caso comunque raro se la tabella è adeguatamente commisurata al numero di elementi che dovrà contenere.
Questo in generale sulle hash table, sul loro impiego specifico per gestire le pagine di memoria non ti so dire.