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

Información Básica

  • ID del Artículo: 2504.17918
  • Título: PHast -- Perfect Hashing made fast
  • Autores: Piotr Beling (Universidad de Łódź, Polonia), Peter Sanders (Instituto Tecnológico de Karlsruhe, Alemania)
  • Clasificación: cs.DS cs.DB cs.PF
  • Fecha de Publicación: 22 de octubre de 2025 (versión arXiv)
  • Enlace del Artículo: https://arxiv.org/abs/2504.17918

Resumen

Las funciones hash perfectas asignan "nombres" únicos a claves arbitrarias requiriendo solo algunos bits por clave. Este es un componente esencial en aplicaciones como tablas hash estáticas, bases de datos o bioinformática. Este artículo introduce el enfoque PHast que combina las consultas más rápidas disponibles, construcción muy rápida y buen consumo de espacio (por debajo de 2 bits por clave). PHast mejora la colocación de cubetas, que primero hace hash de cada clave k en una cubeta, y luego busca la semilla de cubeta s tal que una función de colocación mapea pares (s,k) de manera libre de colisiones. PHast puede usar funciones hash de rango pequeño con mapeo lineal, codificación de semillas de ancho fijo y construcción paralela. Esto se logra usando pequeños segmentos superpuestos de valores permitidos y bumping para manejar asignaciones de semillas infructuosas. Una variante que llamamos PHast+ usa colocación aditiva, que permite búsqueda de semillas bit-paralela, acelerando la construcción por un orden de magnitud.

Antecedentes de Investigación y Motivación

Definición del Problema

Una Función Hash Perfecta (PHF) es una función inyectiva que mapea un conjunto de claves {k₁, ..., kₙ} a {0, ..., m-1}. Cuando m = n, se denomina Función Hash Perfecta Mínima (MPHF). Este es un componente importante en aplicaciones como bases de datos, índices de texto e bioinformática.

Motivación de la Investigación

  1. Desafío de Optimización Multiobjetivo: El diseño de MPHF enfrenta un problema de optimización multiobjetivo entre consumo de espacio, tiempo de construcción y tiempo de consulta
  2. Límite Teórico Inferior: El límite teórico inferior de MPHF es log₂ e ≈ 1.44 bits por clave
  3. Necesidades Prácticas: En la práctica, PHF se usa comúnmente para acelerar estructuras de datos estáticas, por lo que las consultas rápidas son críticas

Limitaciones de Métodos Existentes

  1. Métodos de Colocación de Cubetas: CHD, FCH, PTHash, PHOBIC requieren funciones de asignación de cubetas no lineales o codificación de semillas de longitud variable, afectando la velocidad de consulta
  2. Métodos de División Recursiva: Aunque tienen alta eficiencia de espacio, el tiempo de consulta es más lento, requiriendo decodificación de información de navegación de longitud variable
  3. Métodos de Huella Digital: Requieren al menos e bits por clave, y las consultas necesitan operaciones de rank en vectores de bits
  4. Sobrecarga de Construcción Paralela: Los métodos existentes requieren pasos de consulta adicionales para recuperar valores de desplazamiento

Contribuciones Principales

  1. Mapeo Lineal de Cubetas: A través de mapeo lineal a pequeños segmentos superpuestos, evita asignación de cubetas no lineal, realizando construcción multihilo amigable con caché
  2. Mecanismo de Bumping: Permite usar funciones hash de rango pequeño y codificación de semillas de ancho fijo, evitando búsqueda local compleja
  3. Asignación Heurística de Semillas: Reduce el consumo de espacio seleccionando semillas que ocupan el mínimo de valores de función
  4. Variante PHast+: Usa función de colocación aditiva para implementar búsqueda de semillas bit-paralela, mejorando la velocidad de construcción por un orden de magnitud
  5. Evaluación Experimental Integral: Comparación detallada de rendimiento con métodos existentes

Explicación Detallada del Método

Definición de la Tarea

Dado un conjunto de n claves, construir una función hash perfecta f tal que:

  • f sea inyectiva (sin colisiones)
  • El tiempo de consulta sea lo más rápido posible
  • El tiempo de construcción sea razonable
  • El consumo de espacio sea bajo (objetivo < 2 bits por clave)

Arquitectura del Algoritmo Principal

Función Map-or-Bump

PHast se basa en el método "map-or-bump", mapeando n claves a {0, 1, ..., m-1}:

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

Donde:

  • h(k) es una función hash de u-bit (u = 64)
  • s = seeds⌊βh(k)⌋ es la semilla
  • α, β son factores de escala
  • p(s, h(k)) es la función de colocación

Componentes Técnicos Clave

  1. Asignación Lineal de Cubetas:
    • Índice de cubeta: ⌊B/2ᵘ · cᵢ⌋
    • Valor de inicio de segmento: ⌊(m-L+1)/2ᵘ · cᵢ⌋
    • Valor de salida: ⌊(m-L+1)/2ᵘ · cᵢ⌋ + p(s, cᵢ)
  2. Asignación de Semillas Ventaneada:
    • Usa ventana deslizante de tamaño W = 256
    • Cola de prioridad para gestionar cubetas sin semilla
    • Función de prioridad: ℓ(s) - 1024b (s es tamaño de cubeta, b es índice de cubeta)
  3. Mecanismo de Bumping:
    • Las cubetas donde no se puede encontrar semilla se marcan como bumped (valor de semilla = 0)
    • Aproximadamente 1% de cubetas son bumped, con impacto mínimo en tiempo de consulta esperado

Optimización PHast+

PHast+ usa función de colocación aditiva para construcción rápida:

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

Búsqueda de Semillas Bit-Paralela:

  • Prueba simultáneamente 64 semillas consecutivas
  • Usa operaciones bit a bit para detección rápida de colisiones
  • Mejora de velocidad de construcción de aproximadamente 10 veces

Construcción Paralela

  1. Paralelización sin Comunicación:
    • Array de semillas dividido en t bloques y t-1 espacios
    • Hilos calculan semillas en bloques en paralelo
    • Tamaño de espacio: ⌈LB/(m-L+1)⌉ cubetas
  2. Diseño Amigable con Caché:
    • Procesa cubetas en orden de índice
    • Usa búfer circular para representar mapa de bits de ocupación
    • Patrón de acceso a memoria secuencial

Configuración Experimental

Entorno Experimental

  • Hardware: AMD Ryzen 5600G @3.9GHz (6 núcleos, 12 hilos)
  • Caché: 384KB/3MB/16MB L1/L2/L3
  • Compilador: Rust 1.84.1, GCC 12.2.0
  • Número de Hilos: 12 hilos (pruebas multihilo)

Conjuntos de Datos

  • Claves Enteras Aleatorias: 5×10⁷ y 5×10⁸ enteros aleatorios de 64 bits
  • Claves de Cadena Aleatoria: Cadenas aleatorias de longitud 10-50 bytes
  • Función Hash: GxHash (hash SIMD de alto rendimiento)

Métodos de Comparación

  • Colocación de Cubetas: PTHash, PHOBIC, PtrHash
  • División Recursiva: SIMDRecSplit, Bipartite ShockHash
  • Métodos de Huella Digital: FiPS, FMPH, FMPHGO
  • Recuperación de Función Estática: SicHash

Indicadores de Evaluación

  • Consumo de Espacio: bits por clave
  • Tiempo de Consulta: nanosegundos por consulta
  • Tiempo de Construcción: nanosegundos por clave
  • Aceleración Paralela: rendimiento de un hilo vs multihilo

Resultados Experimentales

Rendimiento Principal

Rendimiento de Consulta (5×10⁷ claves)

  • PHast: 9-22 ns/consulta, espacio 1.82-2.33 bits/clave
  • PHast+: 10-15 ns/consulta, espacio 1.84-2.24 bits/clave
  • PtrHash: 14-17 ns/consulta, espacio 2.12-2.99 bits/clave
  • PTHash: 40-54 ns/consulta, espacio 2.11-3.19 bits/clave

Rendimiento de Construcción (5×10⁷ claves, un hilo)

  • PHast+: 61-140 ns/clave (configuración más rápida)
  • PHast: 133-5322 ns/clave (relacionado con tamaño de semilla)
  • PtrHash: 75-192 ns/clave
  • FMPH: 40-57 ns/clave (pero espacio más grande)

Aceleración Paralela

  • PHast: 8.5-9.6 veces aceleración (paralelización eficiente de asignación de semillas)
  • PHast+: 4.1-5.4 veces aceleración
  • PtrHash: 3.6-5.1 veces aceleración

Resultados de Optimización de Parámetros

Configuración Óptima (Minimización de Espacio)

Tamaño de Semilla SPHast λEspacio(bits/clave)PHast+ λEspacio(bits/clave)
84.71.915.352.09
106.051.856.351.90
127.351.817.41.82

Experimentos de Ablación

  1. Selección Heurística de Semillas: Sin ella, espacio aumenta de 1.92 a 2.39 bits/clave
  2. Tamaño de Ventana: Con W=1, espacio aumenta a 2.20 bits/clave, W>256 sin mejora significativa
  3. Límite de Segmento: Remover límite de segmento aumenta espacio significativamente
  4. Orden de Procesamiento de Cubetas: Procesar en orden descendente por tamaño (como CHD) resulta en mayor consumo de espacio

Trabajo Relacionado

Evolución de Métodos de Colocación de Cubetas

  1. CHD: Asignación lineal de cubetas pero construcción lenta, requiere codificación de semillas de longitud variable
  2. FCH/PTHash: Asignación simple no lineal de cubetas, mitiga parcialmente problemas
  3. PHOBIC: Función de asignación de cubetas óptima, pero consultas más lentas
  4. PtrHash: Variante de PHOBIC optimizada para consultas, usa búsqueda local

Otras Categorías de Métodos

  • Métodos de Huella Digital: Construcción rápida pero espacio grande, consultas necesitan operaciones de rank
  • División Recursiva: Espacio cercano al límite teórico pero consultas lentas
  • Recuperación de Función Estática: Requiere sondeo complejo de múltiples posiciones

Singularidad de PHast

PHast evita codificación de longitud variable y búsqueda local compleja mediante el mecanismo de bumping, mientras mantiene la simplicidad de asignación lineal de cubetas.

Conclusiones y Discusión

Conclusiones Principales

  1. Rendimiento de Consulta: PHast logra tiempo de consulta cercano al óptimo teórico
  2. Eficiencia de Construcción: PHast+ proporciona velocidad de construcción extremadamente rápida
  3. Eficiencia de Espacio: Logra buen consumo de espacio bajo la premisa de consultas rápidas
  4. Amigable con Paralelización: Construcción paralela sin sobrecarga de consultas adicionales

Limitaciones

  1. Espacio vs Métodos Recursivos: Aún no tan cercano al límite teórico como métodos de división recursiva
  2. Conjuntos de Datos Grandes: Para 5×10⁸ claves, el acceso a memoria se convierte en cuello de botella
  3. Ajuste de Parámetros: Requiere seleccionar combinaciones de parámetros apropiadas según escenario de aplicación

Direcciones Futuras

  1. Construcción en Memoria Externa: Implementar algoritmo en memoria externa descrito en Sección 6
  2. Consultas por Lotes: Soportar optimizaciones de consultas por lotes similares a PtrHash
  3. Aceleración GPU: Explorar posibilidades de paralelización GPU
  4. Extensión k-perfect: Soportar casos donde k claves pueden mapear al mismo valor

Evaluación Profunda

Ventajas

Innovación Técnica

  1. Filosofía de Diseño Simplificada: Evita mecanismos complejos mediante bumping, encarnando "menos es más"
  2. Mapeo Lineal: Recupera la simplicidad de asignación lineal de cubetas mientras resuelve sus problemas
  3. Optimización Bit-Paralela: La búsqueda de semillas bit-paralela de PHast+ es una innovación de ingeniería importante
  4. Diseño Amigable con Caché: El procesamiento secuencial y diseño de búfer circular consideran características de CPU modernas

Suficiencia Experimental

  1. Comparación Integral: Comparación detallada de rendimiento cubriendo todos los métodos principales
  2. Evaluación Multidimensional: Análisis de compensaciones entre espacio, tiempo de consulta y tiempo de construcción
  3. Investigación de Parámetros: Experimentos detallados de ajuste de parámetros y ablación
  4. Reproducibilidad: Implementación de código abierto y configuración experimental detallada

Deficiencias

Limitaciones del Método

  1. Sobrecarga de Espacio: Comparado con métodos recursivos, aún hay una brecha de aproximadamente 0.4 bits/clave
  2. Sensibilidad a Parámetros: Requiere ajustar múltiples parámetros según cantidad de claves y tamaño de semilla
  3. Análisis Teórico: Carece de prueba teórica rigurosa de complejidad de espacio

Insuficiencias Experimentales

  1. Conjuntos de Datos Únicos: Principalmente usa datos aleatorios, carece de pruebas con datos de aplicaciones reales
  2. Jerarquía de Memoria: Análisis insuficiente del impacto en diferentes niveles de caché
  3. Estabilidad a Largo Plazo: No prueba rendimiento en uso a largo plazo a gran escala

Evaluación de Impacto

Contribución Académica

  1. Valor Teórico: Demuestra que métodos simples pueden ser competitivos bajo optimización de ingeniería
  2. Metodología: Proporciona pensamiento de "simplificación en lugar de complejidad" para diseño de estructuras de datos
  3. Establecimiento de Referencia: Establece nuevo estándar para rendimiento de consulta en hash perfecto

Valor Práctico

  1. Aplicación Directa: Puede usarse en bases de datos, motores de búsqueda y otros escenarios que requieren consultas rápidas
  2. Referencia de Ingeniería: El diseño amigable con caché y paralelización puede adaptarse a otras estructuras de datos
  3. Contribución de Código Abierto: La implementación en Rust proporciona herramientas de alta calidad para la comunidad

Escenarios de Aplicación

Aplicaciones Ideales

  1. Tablas Hash Estáticas: Escenarios donde el conjunto de claves es fijo y las consultas son frecuentes
  2. Índices de Base de Datos: Sistemas de bases de datos que necesitan búsqueda rápida de pares clave-valor
  3. Bioinformática: Aplicaciones como indexación de k-mer que requieren gran cantidad de consultas
  4. Sistemas de Caché: Cachés en memoria que requieren respuesta de consulta extremadamente rápida

Condiciones de Limitación

  1. Memoria Suficiente: Requiere suficiente memoria para almacenar la estructura de datos completa
  2. Datos Estáticos: No es adecuado para escenarios con actualizaciones frecuentes
  3. Intensivo en Consultas: Mejor para aplicaciones donde la frecuencia de consultas es mucho mayor que la de construcción

Referencias

Trabajos Relacionados Clave

  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"

Fundamentos Teóricos

  1. Fredman & Komlós: Límite teórico inferior de función hash perfecta
  2. Belazzougui et al.: Trabajo fundamental en métodos de colocación de cubetas

El artículo PHast demuestra que en el campo de la ingeniería de algoritmos, mediante una comprensión profunda de la naturaleza del problema y las características del hardware moderno, los métodos simples, después de una optimización cuidadosa, pueden alcanzar e incluso superar el rendimiento de métodos complejos. Esto proporciona una perspectiva importante para el diseño de estructuras de datos: a veces, la clave para resolver problemas no es aumentar la complejidad, sino encontrar la dirección correcta de simplificación.