2025-11-25T13:49:17.496621

PHast -- Perfect Hashing made fast

Beling, Sanders
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.
academic

PHast -- Perfect Hashing made fast

Informazioni Fondamentali

  • ID Articolo: 2504.17918
  • Titolo: PHast -- Perfect Hashing made fast
  • Autori: Piotr Beling (Università di Łódź, Polonia), Peter Sanders (Istituto di Tecnologia di Karlsruhe, Germania)
  • Classificazione: cs.DS cs.DB cs.PF
  • Data di Pubblicazione: 22 ottobre 2025 (versione arXiv)
  • Link Articolo: https://arxiv.org/abs/2504.17918

Riassunto

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.

Contesto di Ricerca e Motivazione

Definizione del Problema

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.

Motivazione della Ricerca

  1. 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
  2. Limite Teorico Inferiore: Il limite teorico inferiore di MPHF è log₂ e ≈ 1,44 bit per chiave
  3. Esigenze Pratiche: Nella pratica, PHF è comunemente utilizzato per accelerare strutture dati statiche, quindi l'interrogazione veloce è cruciale

Limitazioni dei Metodi Esistenti

  1. 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
  2. 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
  3. Metodo Fingerprint: Richiede almeno e bit per chiave e l'interrogazione necessita di operazioni di rank su vettori di bit
  4. Overhead di Costruzione Parallela: I metodi esistenti richiedono passaggi di interrogazione aggiuntivi per recuperare i valori di offset

Contributi Principali

  1. 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
  2. Meccanismo Bumping: Consente l'uso di funzioni di hash a piccolo intervallo e codifica di seed a larghezza fissa, evitando ricerche locali complesse
  3. Assegnazione Euristica dei Seed: Riducendo il consumo di spazio selezionando seed che occupano il numero minimo di valori di funzione
  4. Variante PHast+: Utilizza funzione di posizionamento additivo per realizzare ricerca di seed bit-parallela, accelerando la costruzione di un ordine di grandezza
  5. Valutazione Sperimentale Completa: Confronto dettagliato delle prestazioni con metodi esistenti

Spiegazione Dettagliata del Metodo

Definizione del Compito

Dato un insieme di n chiavi, costruire una funzione di hash perfetto f tale che:

  • f sia iniettiva (senza collisioni)
  • Il tempo di interrogazione sia il più veloce possibile
  • Il tempo di costruzione sia ragionevole
  • Il consumo di spazio sia basso (obiettivo < 2 bit per chiave)

Architettura dell'Algoritmo Principale

Funzione Map-or-Bump

PHast si basa sul metodo "map-or-bump", mappando n chiavi a {0, 1, ..., m-1}:

f(k) = {
  ⌊αh(k)⌋ + p(s, h(k))  se s > 0
  fallback_for_bumped(k)  altrimenti
}

Dove:

  • h(k) è una funzione di hash a u-bit (u = 64)
  • s = seeds⌊βh(k)⌋ è il seed
  • α, β sono fattori di scala
  • p(s, h(k)) è la funzione di posizionamento

Componenti Tecnici Chiave

  1. Allocazione Lineare dei Bucket:
    • Indice del bucket: ⌊B/2ᵘ · cᵢ⌋
    • Valore di inizio della fetta: ⌊(m-L+1)/2ᵘ · cᵢ⌋
    • Valore di output: ⌊(m-L+1)/2ᵘ · cᵢ⌋ + p(s, cᵢ)
  2. Assegnazione dei Seed con Finestra:
    • Utilizza una finestra scorrevole di dimensione W = 256
    • Coda di priorità per gestire i bucket non seminati
    • Funzione di priorità: ℓ(s) - 1024b (s è la dimensione del bucket, b è l'indice del bucket)
  3. Meccanismo Bumping:
    • I bucket per cui non è possibile trovare un seed sono contrassegnati come bumped (valore del seed = 0)
    • Circa l'1% dei bucket viene bumped, con effetto minimo sul tempo di interrogazione atteso

Ottimizzazione PHast+

PHast+ utilizza una funzione di posizionamento additivo per costruzione veloce:

p(s, c) = c mod L + s - 1        // Formula 3.2
p(s, c) = (c + δs) mod L         // Formula 3.3

Ricerca di Seed Bit-Parallela:

  • Testa simultaneamente la fattibilità di 64 seed consecutivi
  • Utilizza operazioni bit per rilevare rapidamente le collisioni
  • Accelerazione della costruzione di circa 10 volte

Costruzione Parallela

  1. Parallelizzazione Senza Comunicazione:
    • L'array di seed è diviso in t blocchi e t-1 gap
    • I thread calcolano in parallelo i seed nei blocchi
    • Dimensione del gap: ⌈LB/(m-L+1)⌉ bucket
  2. Progettazione Cache-Friendly:
    • Elaborazione dei bucket in ordine di indice
    • Utilizzo di buffer circolare per rappresentare la bitmap di occupazione
    • Modello di accesso alla memoria sequenziale

Configurazione Sperimentale

Ambiente Sperimentale

  • Hardware: AMD Ryzen 5600G @3.9GHz (6 core 12 thread)
  • Cache: 384KB/3MB/16MB L1/L2/L3
  • Compilatore: Rust 1.84.1, GCC 12.2.0
  • Numero di Thread: 12 thread (test multi-thread)

Dataset

  • Chiavi Intere Casuali: 5×10⁷ e 5×10⁸ interi a 64 bit casuali
  • Chiavi Stringa Casuale: Stringhe casuali di lunghezza 10-50 byte
  • Funzione di Hash: GxHash (hash SIMD ad alte prestazioni)

Metodi di Confronto

  • Bucket Placement: PTHash, PHOBIC, PtrHash
  • Divisione Ricorsiva: SIMDRecSplit, Bipartite ShockHash
  • Metodo Fingerprint: FiPS, FMPH, FMPHGO
  • Recupero Funzione Statica: SicHash

Metriche di Valutazione

  • Consumo di Spazio: bit per chiave
  • Tempo di Interrogazione: nanosecondi per interrogazione
  • Tempo di Costruzione: nanosecondi per chiave
  • Rapporto di Accelerazione Parallela: prestazioni single-thread vs multi-thread

Risultati Sperimentali

Prestazioni Principali

Prestazioni di Interrogazione (5×10⁷ chiavi)

  • PHast: 9-22 ns/interrogazione, spazio 1,82-2,33 bit/chiave
  • PHast+: 10-15 ns/interrogazione, spazio 1,84-2,24 bit/chiave
  • PtrHash: 14-17 ns/interrogazione, spazio 2,12-2,99 bit/chiave
  • PTHash: 40-54 ns/interrogazione, spazio 2,11-3,19 bit/chiave

Prestazioni di Costruzione (5×10⁷ chiavi, single-thread)

  • PHast+: 61-140 ns/chiave (configurazione più veloce)
  • PHast: 133-5322 ns/chiave (correlato alla dimensione del seed)
  • PtrHash: 75-192 ns/chiave
  • FMPH: 40-57 ns/chiave (ma spazio maggiore)

Accelerazione Parallela

  • PHast: accelerazione 8,5-9,6 volte (parallelizzazione efficiente dell'assegnazione dei seed)
  • PHast+: accelerazione 4,1-5,4 volte
  • PtrHash: accelerazione 3,6-5,1 volte

Risultati dell'Ottimizzazione dei Parametri

Configurazione Ottimale (Minimizzazione dello Spazio)

Dimensione Seed SPHast λSpazio (bit/chiave)PHast+ λSpazio (bit/chiave)
84,71,915,352,09
106,051,856,351,90
127,351,817,41,82

Esperimenti di Ablazione

  1. Selezione Euristica dei Seed: Dopo la rimozione, lo spazio aumenta da 1,92 a 2,39 bit/chiave
  2. Dimensione della Finestra: Con W=1 lo spazio aumenta a 2,20 bit/chiave, W>256 non mostra miglioramenti significativi
  3. Limite della Fetta: La rimozione del limite della fetta aumenta significativamente il consumo di spazio
  4. Ordine di Elaborazione dei Bucket: L'elaborazione in ordine decrescente di dimensione (come in CHD) porta a maggior consumo di spazio

Lavori Correlati

Evoluzione del Metodo Bucket Placement

  1. CHD: Allocazione lineare dei bucket ma costruzione lenta, richiede codifica di seed a lunghezza variabile
  2. FCH/PTHash: Semplice allocazione non lineare dei bucket, mitiga parzialmente i problemi
  3. PHOBIC: Funzione di allocazione bucket ottimale, ma interrogazione più lenta
  4. PtrHash: Variante PHOBIC ottimizzata per interrogazione, utilizza ricerca locale

Altre Categorie di Metodi

  • Metodo Fingerprint: Costruzione veloce ma spazio grande, interrogazione richiede operazioni di rank
  • Divisione Ricorsiva: Spazio vicino al limite teorico ma interrogazione lenta
  • Recupero Funzione Statica: Richiede complesso probe multi-posizione

Unicità di PHast

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.

Conclusioni e Discussione

Conclusioni Principali

  1. Prestazioni di Interrogazione: PHast realizza un tempo di interrogazione quasi ottimale dal punto di vista teorico
  2. Efficienza di Costruzione: PHast+ fornisce una velocità di costruzione estremamente veloce
  3. Efficienza dello Spazio: Realizza un buon consumo di spazio premessa di interrogazione veloce
  4. Parallelizzazione Friendly: Costruzione parallela senza overhead di interrogazione aggiuntivo

Limitazioni

  1. Spazio vs Metodo Ricorsivo: Ancora non è vicino al limite teorico come il metodo di divisione ricorsiva
  2. Dataset Grandi: Per 5×10⁸ chiavi, l'accesso alla memoria diventa un collo di bottiglia
  3. Sintonizzazione dei Parametri: Richiede la selezione di combinazioni di parametri appropriate in base allo scenario applicativo

Direzioni Future

  1. Costruzione Esterna: Implementazione dell'algoritmo di memoria esterna delineato nella Sezione 6
  2. Interrogazione in Batch: Supporto per ottimizzazioni di interrogazione in batch simili a PtrHash
  3. Accelerazione GPU: Esplorazione della possibilità di parallelizzazione GPU
  4. Estensione k-perfect: Supporto per situazioni in cui k chiavi possono essere mappate allo stesso valore

Valutazione Approfondita

Punti di Forza

Innovazione Tecnica

  1. Filosofia di Progettazione Semplificata: Evita meccanismi complessi attraverso bumping, incarnando il principio "meno è più"
  2. Mappatura Lineare: Ripristina la semplicità dell'allocazione lineare dei bucket risolvendo al contempo i suoi problemi
  3. Ottimizzazione Bit-Parallela: La ricerca di seed bit-parallela di PHast+ è un'importante innovazione ingegneristica
  4. Progettazione Cache-Friendly: L'elaborazione sequenziale e il design del buffer circolare considerano le caratteristiche della CPU moderna

Completezza Sperimentale

  1. Confronto Completo: Confronto dettagliato delle prestazioni che copre vari metodi mainstream
  2. Valutazione Multi-Dimensionale: Analisi dei compromessi tra spazio, tempo di interrogazione e tempo di costruzione
  3. Ricerca dei Parametri: Esperimenti dettagliati di sintonizzazione dei parametri e ablazione
  4. Riproducibilità: Implementazione open-source e configurazione sperimentale dettagliata

Insufficienze

Limitazioni del Metodo

  1. Overhead di Spazio: Rispetto ai metodi ricorsivi, c'è ancora un divario di circa 0,4 bit/chiave
  2. Sensibilità ai Parametri: Richiede l'adattamento di più parametri in base al numero di chiavi e alla dimensione del seed
  3. Analisi Teorica: Manca una prova teorica rigorosa della complessità dello spazio

Insufficienze Sperimentali

  1. Dataset Singolo: Utilizza principalmente dati casuali, mancano test su dati di applicazioni reali
  2. Gerarchia di Memoria: Analisi insufficiente dell'impatto dei diversi livelli di cache
  3. Stabilità a Lungo Termine: Nessun test delle prestazioni di utilizzo a lungo termine su larga scala

Valutazione dell'Impatto

Contributo Accademico

  1. Valore Teorico: Dimostra la competitività dei metodi semplici sotto ottimizzazione ingegneristica
  2. Metodologia: Fornisce il pensiero di "semplificazione piuttosto che complicazione" per la progettazione di strutture dati
  3. Benchmark Stabilito: Stabilisce un nuovo benchmark per le prestazioni di interrogazione del perfect hashing

Valore Pratico

  1. Applicazione Diretta: Può essere utilizzato in database, motori di ricerca e altri scenari che richiedono interrogazioni veloci
  2. Riferimento Ingegneristico: La progettazione cache-friendly e la parallelizzazione possono essere applicate ad altre strutture dati
  3. Contributo Open-Source: L'implementazione Rust fornisce strumenti di alta qualità alla comunità

Scenari Applicabili

Applicazioni Ideali

  1. Tabella Hash Statica: Scenari in cui l'insieme di chiavi è fisso e le interrogazioni sono frequenti
  2. Indice di Database: Sistemi di database che richiedono ricerca rapida di coppie chiave-valore
  3. Bioinformatica: Applicazioni come l'indicizzazione di k-mer che richiedono un gran numero di interrogazioni
  4. Sistema di Cache: Cache in memoria che richiedono risposta di interrogazione estremamente veloce

Condizioni di Limitazione

  1. Memoria Sufficiente: Richiede memoria sufficiente per archiviare la struttura dati completa
  2. Dati Statici: Non è adatto a scenari con aggiornamenti frequenti
  3. Interrogazione Intensiva: Adatto per applicazioni in cui la frequenza di interrogazione è molto superiore alla frequenza di costruzione

Bibliografia

Lavori Correlati Chiave

  1. PHOBIC: Hermann et al. "Perfect hashing with optimized bucket sizes and interleaved coding"
  2. PtrHash: Groot Koerkamp "PtrHash: Minimal Perfect Hashing at RAM Throughput"
  3. PTHash: Pibiri & Trani "PTHash: Revisiting FCH minimal perfect hashing"
  4. SIMDRecSplit: Bez et al. "High performance construction of RecSplit based minimal perfect hash functions"

Fondamenti Teorici

  1. Fredman & Komlós: Limite teorico inferiore della funzione di hash perfetto
  2. 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.