Perfect hash functions give unique "names" to arbitrary keys requiring only a few bits per key. This is an essential building block in applications like static hash tables, databases, or bioinformatics. This paper introduces the PHast approach that combines the fastest available queries, very fast construction, and good space consumption (below 2 bits per key). PHast improves bucket-placement which first hashes each key k to a bucket, and then looks for the bucket seed s such that a placement function maps pairs (s,k) in a collision-free way. PHast can use small-range hash functions with linear mapping, fixed-width encoding of seeds, and parallel construction. This is achieved using small overlapping slices of allowed values and bumping to handle unsuccessful seed assignment. A variant we called PHast+ uses additive placement, which enables bit-parallel seed searching, speeding up the construction by an order of magnitude.
Le funzioni di hash perfetto assegnano "nomi" univoci a chiavi arbitrarie richiedendo solo pochi bit per chiave. Questo è un componente essenziale in applicazioni come tabelle hash statiche, database o bioinformatica. Questo articolo introduce l'approccio PHast che combina le interrogazioni più veloci disponibili, costruzione molto veloce e buon consumo di spazio (inferiore a 2 bit per chiave). PHast migliora il posizionamento dei bucket, che prima esegue l'hash di ogni chiave k in un bucket, e poi ricerca il seed del bucket s tale che una funzione di posizionamento mappi le coppie (s,k) in modo privo di collisioni. PHast può utilizzare funzioni di hash a piccolo intervallo con mappatura lineare, codifica a larghezza fissa dei seed e costruzione parallela. Questo si ottiene utilizzando piccole fette sovrapposte di valori consentiti e bumping per gestire l'assegnazione di seed non riuscita. Una variante che abbiamo chiamato PHast+ utilizza il posizionamento additivo, che abilita la ricerca di seed bit-parallela, accelerando la costruzione di un ordine di grandezza.
Una Funzione di Hash Perfetto (PHF) è una funzione iniettiva che mappa un insieme di chiavi {k₁, ..., kₙ} a {0, ..., m-1}. Quando m = n, è chiamata Funzione di Hash Perfetto Minimo (MPHF). Questo è un componente importante in applicazioni come database, indici di testo e bioinformatica.
Sfida di Ottimizzazione Multi-Obiettivo: La progettazione di MPHF affronta un problema di ottimizzazione multi-obiettivo tra consumo di spazio, tempo di costruzione e tempo di interrogazione
Limite Teorico Inferiore: Il limite teorico inferiore di MPHF è log₂ e ≈ 1,44 bit per chiave
Esigenze Pratiche: Nella pratica, PHF è comunemente utilizzato per accelerare strutture dati statiche, quindi l'interrogazione veloce è cruciale
Metodo Bucket Placement: CHD, FCH, PTHash, PHOBIC richiedono funzioni di allocazione bucket non lineari o codifica di seed a lunghezza variabile, influenzando la velocità di interrogazione
Metodo Divisione Ricorsiva: Sebbene sia efficiente nello spazio, il tempo di interrogazione è più lento e richiede la decodifica di informazioni di navigazione a lunghezza variabile
Metodo Fingerprint: Richiede almeno e bit per chiave e l'interrogazione necessita di operazioni di rank su vettori di bit
Overhead di Costruzione Parallela: I metodi esistenti richiedono passaggi di interrogazione aggiuntivi per recuperare i valori di offset
Mappatura Lineare dei Bucket: Attraverso la mappatura lineare a piccole fette sovrapposte, evita l'allocazione non lineare dei bucket, realizzando costruzione multi-thread cache-friendly
Meccanismo Bumping: Consente l'uso di funzioni di hash a piccolo intervallo e codifica di seed a larghezza fissa, evitando ricerche locali complesse
Assegnazione Euristica dei Seed: Riducendo il consumo di spazio selezionando seed che occupano il numero minimo di valori di funzione
Variante PHast+: Utilizza funzione di posizionamento additivo per realizzare ricerca di seed bit-parallela, accelerando la costruzione di un ordine di grandezza
Valutazione Sperimentale Completa: Confronto dettagliato delle prestazioni con metodi esistenti
PHast evita la codifica a lunghezza variabile e la ricerca locale complessa attraverso il meccanismo di bumping, mantenendo al contempo la semplicità dell'allocazione lineare dei bucket.
Fredman & Komlós: Limite teorico inferiore della funzione di hash perfetto
Belazzougui et al.: Lavoro fondamentale del metodo bucket placement
L'articolo PHast dimostra che nel campo dell'ingegneria degli algoritmi, attraverso una profonda comprensione dell'essenza del problema e delle caratteristiche dell'hardware moderno, i metodi semplici, dopo un'attenta ottimizzazione, possono raggiungere o addirittura superare le prestazioni di metodi complessi. Questo fornisce un'importante intuizione per la progettazione di strutture dati: a volte la chiave per risolvere un problema non è aumentare la complessità, ma trovare la giusta direzione di semplificazione.