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

Основная информация

  • ID статьи: 2504.17918
  • Название: PHast -- Perfect Hashing made fast
  • Авторы: Piotr Beling (University of Łódź, Poland), Peter Sanders (Karlsruhe Institute of Technology, Germany)
  • Классификация: cs.DS cs.DB cs.PF
  • Дата публикации: 22 октября 2025 г. (версия arXiv)
  • Ссылка на статью: https://arxiv.org/abs/2504.17918

Аннотация

Идеальные хеш-функции присваивают уникальные "имена" произвольным ключам, требуя всего несколько бит на ключ. Это является важным строительным блоком в приложениях, таких как статические хеш-таблицы, базы данных или биоинформатика. В данной статье представлен подход PHast, который объединяет самые быстрые доступные запросы, очень быстрое построение и хорошее потребление памяти (менее 2 бит на ключ). PHast улучшает размещение в корзинах, которое сначала хеширует каждый ключ k в корзину, а затем ищет начальное значение корзины s таким образом, чтобы функция размещения отображала пары (s,k) без коллизий. PHast может использовать хеш-функции с малым диапазоном с линейным отображением, кодирование начальных значений фиксированной ширины и параллельное построение. Это достигается с использованием малых перекрывающихся срезов допустимых значений и механизма "bumping" для обработки неудачного назначения начальных значений. Вариант, называемый PHast+, использует аддитивное размещение, что позволяет выполнять поиск начальных значений с битовым параллелизмом, ускоряя построение на порядок величины.

Предпосылки исследования и мотивация

Определение проблемы

Идеальная хеш-функция (PHF) — это инъективная функция, отображающая множество ключей {k₁, ..., kₙ} в {0, ..., m-1}. Когда m = n, она называется минимальной идеальной хеш-функцией (MPHF). Это важный строительный блок для приложений в базах данных, текстовых индексах и биоинформатике.

Мотивация исследования

  1. Задача многокритериальной оптимизации: Разработка MPHF требует решения задачи многокритериальной оптимизации потребления памяти, времени построения и времени запроса
  2. Теоретический нижний предел: Теоретический нижний предел для MPHF составляет log₂ e ≈ 1,44 бита на ключ
  3. Практические требования: На практике PHF часто используются для ускорения статических структур данных, поэтому быстрые запросы критически важны

Ограничения существующих методов

  1. Методы размещения в корзинах: CHD, FCH, PTHash, PHOBIC требуют нелинейных функций распределения по корзинам или кодирования начальных значений переменной длины, что влияет на скорость запросов
  2. Методы рекурсивного разбиения: Хотя они обеспечивают хорошую эффективность использования памяти, время запроса медленнее и требует декодирования информации навигации переменной длины
  3. Методы отпечатков: Требуют не менее e бит на ключ и операции rank над битовыми векторами для запросов
  4. Накладные расходы параллельного построения: Существующие методы требуют дополнительных шагов запроса для получения значений смещений

Основные вклады

  1. Линейное отображение корзин: Через линейное отображение в малые перекрывающиеся срезы избегается нелинейное распределение по корзинам, обеспечивая кэш-дружественное многопоточное построение
  2. Механизм bumping: Позволяет использовать хеш-функции с малым диапазоном и кодирование начальных значений фиксированной ширины, избегая сложного локального поиска
  3. Эвристическое назначение начальных значений: Выбор начальных значений, занимающих минимальное количество значений функции, для снижения потребления памяти
  4. Вариант PHast+: Использует аддитивную функцию размещения для реализации поиска начальных значений с битовым параллелизмом, ускоряя построение на порядок величины
  5. Комплексная экспериментальная оценка: Детальное сравнение производительности с существующими методами

Описание метода

Определение задачи

Для заданного множества n ключей построить идеальную хеш-функцию f такую, что:

  • f является инъективной (без коллизий)
  • время запроса максимально быстро
  • время построения разумно
  • потребление памяти низко (целевое значение < 2 бита на ключ)

Архитектура основного алгоритма

Функция Map-or-Bump

PHast основан на методе "map-or-bump", отображающем n ключей в {0, 1, ..., m-1}:

f(k) = {
  ⌊αh(k)⌋ + p(s, h(k))  если s > 0
  fallback_for_bumped(k)  иначе
}

где:

  • h(k) — хеш-функция u-бит (u = 64)
  • s = seeds⌊βh(k)⌋ — начальное значение
  • α, β — масштабирующие коэффициенты
  • p(s, h(k)) — функция размещения

Ключевые технические компоненты

  1. Линейное распределение по корзинам:
    • Индекс корзины: ⌊B/2ᵘ · cᵢ⌋
    • Начало среза: ⌊(m-L+1)/2ᵘ · cᵢ⌋
    • Выходное значение: ⌊(m-L+1)/2ᵘ · cᵢ⌋ + p(s, cᵢ)
  2. Оконное назначение начальных значений:
    • Использование скользящего окна размером W = 256
    • Управление неинициализированными корзинами приоритетной очередью
    • Функция приоритета: ℓ(s) - 1024b (s — размер корзины, b — индекс корзины)
  3. Механизм bumping:
    • Корзины, для которых не удается найти начальное значение, помечаются как bumped (значение начального значения = 0)
    • Примерно 1% корзин помечаются как bumped, что минимально влияет на ожидаемое время запроса

Оптимизация PHast+

PHast+ использует аддитивную функцию размещения для быстрого построения:

p(s, c) = c mod L + s - 1        // Формула 3.2
p(s, c) = (c + δs) mod L         // Формула 3.3

Поиск начальных значений с битовым параллелизмом:

  • Одновременное тестирование 64 последовательных начальных значений на допустимость
  • Использование битовых операций для быстрого обнаружения коллизий
  • Ускорение построения примерно в 10 раз

Параллельное построение

  1. Параллелизм без коммуникации:
    • Массив начальных значений разбивается на t блоков и t-1 промежутков
    • Потоки параллельно вычисляют начальные значения в блоках
    • Размер промежутка: ⌈LB/(m-L+1)⌉ корзин
  2. Кэш-дружественный дизайн:
    • Обработка корзин в порядке индексов
    • Использование циклического буфера для представления битовой карты занятости
    • Последовательные паттерны доступа к памяти

Экспериментальная установка

Экспериментальная среда

  • Оборудование: AMD Ryzen 5600G @3.9GHz (6 ядер, 12 потоков)
  • Кэш: 384KB/3MB/16MB L1/L2/L3
  • Компилятор: Rust 1.84.1, GCC 12.2.0
  • Количество потоков: 12 потоков (для многопоточного тестирования)

Наборы данных

  • Случайные целые ключи: 5×10⁷ и 5×10⁸ 64-битных случайных целых чисел
  • Случайные строковые ключи: Случайные строки длиной 10-50 байт
  • Хеш-функция: GxHash (высокопроизводительное SIMD хеширование)

Методы сравнения

  • Размещение в корзинах: PTHash, PHOBIC, PtrHash
  • Рекурсивное разбиение: SIMDRecSplit, Bipartite ShockHash
  • Методы отпечатков: FiPS, FMPH, FMPHGO
  • Поиск статических функций: SicHash

Метрики оценки

  • Потребление памяти: биты на ключ
  • Время запроса: наносекунды на запрос
  • Время построения: наносекунды на ключ
  • Коэффициент параллельного ускорения: производительность однопоточности vs многопоточности

Результаты экспериментов

Основные показатели производительности

Производительность запросов (5×10⁷ ключей)

  • PHast: 9-22 нс/запрос, память 1.82-2.33 бита/ключ
  • PHast+: 10-15 нс/запрос, память 1.84-2.24 бита/ключ
  • PtrHash: 14-17 нс/запрос, память 2.12-2.99 бита/ключ
  • PTHash: 40-54 нс/запрос, память 2.11-3.19 бита/ключ

Производительность построения (5×10⁷ ключей, однопоточность)

  • PHast+: 61-140 нс/ключ (оптимальная конфигурация)
  • PHast: 133-5322 нс/ключ (зависит от размера начального значения)
  • PtrHash: 75-192 нс/ключ
  • FMPH: 40-57 нс/ключ (но большее потребление памяти)

Параллельное ускорение

  • PHast: 8.5-9.6x ускорение (эффективная параллелизация назначения начальных значений)
  • PHast+: 4.1-5.4x ускорение
  • PtrHash: 3.6-5.1x ускорение

Результаты оптимизации параметров

Оптимальная конфигурация (минимизация памяти)

Размер начального значения SPHast λПамять (биты/ключ)PHast+ λПамять (биты/ключ)
84.71.915.352.09
106.051.856.351.90
127.351.817.41.82

Абляционные исследования

  1. Эвристическое выбор начальных значений: После удаления память увеличилась с 1.92 до 2.39 бита/ключ
  2. Размер окна: При W=1 память увеличилась до 2.20 бита/ключ, W>256 не дает значительного улучшения
  3. Ограничение срезов: Удаление ограничения срезов значительно увеличивает потребление памяти
  4. Порядок обработки корзин: Обработка в порядке убывания размера (как в CHD) приводит к большему потреблению памяти

Связанные работы

Эволюция методов размещения в корзинах

  1. CHD: Линейное распределение по корзинам, но медленное построение, требует кодирования начальных значений переменной длины
  2. FCH/PTHash: Простое нелинейное распределение по корзинам, частично решает проблему
  3. PHOBIC: Оптимальная функция распределения по корзинам, но медленнее запросы
  4. PtrHash: Оптимизированный для запросов вариант PHOBIC, использует локальный поиск

Другие категории методов

  • Методы отпечатков: Быстрое построение, но большое потребление памяти, запросы требуют операции rank
  • Рекурсивное разбиение: Потребление памяти близко к теоретическому пределу, но медленнее запросы
  • Поиск статических функций: Требует сложного многопозиционного зондирования

Уникальность PHast

PHast избегает кодирования переменной длины и сложного локального поиска через механизм bumping, одновременно сохраняя простоту линейного распределения по корзинам.

Выводы и обсуждение

Основные выводы

  1. Производительность запросов: PHast достигает времени запроса, близкого к теоретически оптимальному
  2. Эффективность построения: PHast+ обеспечивает чрезвычайно быстрое построение
  3. Эффективность использования памяти: Достигает хорошего потребления памяти при условии быстрых запросов
  4. Дружественность к параллелизму: Параллельное построение без дополнительных накладных расходов запроса

Ограничения

  1. Память vs рекурсивные методы: Все еще не так близко к теоретическому пределу, как методы рекурсивного разбиения
  2. Большие наборы данных: Для 5×10⁸ ключей доступ к памяти становится узким местом
  3. Настройка параметров: Требует выбора подходящей комбинации параметров в зависимости от сценария применения

Направления будущих исследований

  1. Построение во внешней памяти: Реализация алгоритма для внешней памяти, описанного в разделе 6
  2. Пакетные запросы: Поддержка оптимизации пакетных запросов, аналогично PtrHash
  3. Ускорение на GPU: Исследование возможностей параллелизации на GPU
  4. Расширение k-perfect: Поддержка случаев, когда k ключей могут отображаться в одно значение

Глубокая оценка

Преимущества

Технические инновации

  1. Философия упрощенного дизайна: Избегание сложных механизмов через bumping, воплощение принципа "меньше значит больше"
  2. Линейное отображение: Восстановление простоты линейного распределения по корзинам при решении его проблем
  3. Оптимизация с битовым параллелизмом: Поиск начальных значений с битовым параллелизмом в PHast+ — важное инженерное достижение
  4. Кэш-дружественный дизайн: Последовательная обработка и циклический буфер учитывают характеристики современных CPU

Полнота экспериментов

  1. Комплексное сравнение: Детальное сравнение производительности со всеми основными методами
  2. Многомерная оценка: Анализ компромиссов между памятью, временем запроса и временем построения
  3. Исследование параметров: Детальная настройка параметров и абляционные исследования
  4. Воспроизводимость: Открытая реализация и подробное описание экспериментальной установки

Недостатки

Ограничения метода

  1. Потребление памяти: По сравнению с методами рекурсивного разбиения остается разница примерно 0.4 бита/ключ
  2. Чувствительность к параметрам: Требует настройки нескольких параметров в зависимости от количества ключей и размера начального значения
  3. Теоретический анализ: Отсутствует строгое теоретическое доказательство сложности использования памяти

Недостатки экспериментов

  1. Однородность наборов данных: Основное использование случайных данных, отсутствие тестирования на реальных данных приложений
  2. Иерархия памяти: Недостаточный анализ влияния различных уровней кэша
  3. Долгосрочная стабильность: Отсутствие тестирования производительности при длительном использовании в большом масштабе

Оценка влияния

Научный вклад

  1. Теоретическая ценность: Демонстрирует конкурентоспособность простых методов при инженерной оптимизации
  2. Методология: Предоставляет подход "упрощение вместо усложнения" для проектирования структур данных
  3. Установление стандартов: Устанавливает новый стандарт производительности запросов для идеального хеширования

Практическая ценность

  1. Прямое применение: Может использоваться в базах данных, поисковых системах и других сценариях, требующих быстрых запросов
  2. Инженерный справочник: Кэш-дружественный и параллельный дизайн может быть адаптирован для других структур данных
  3. Вклад в открытый код: Реализация на Rust предоставляет высококачественный инструмент для сообщества

Применимые сценарии

Идеальные приложения

  1. Статические хеш-таблицы: Сценарии с фиксированным набором ключей и частыми запросами
  2. Индексы баз данных: Системы баз данных, требующие быстрого поиска ключ-значение
  3. Биоинформатика: Приложения, такие как индексирование k-mer, требующие большого количества запросов
  4. Системы кэширования: Кэши в памяти, требующие чрезвычайно быстрого отклика на запросы

Ограничивающие условия

  1. Достаточность памяти: Требует достаточной памяти для хранения полной структуры данных
  2. Статические данные: Не подходит для сценариев с частыми обновлениями
  3. Интенсивность запросов: Оптимален для приложений, где частота запросов значительно превышает частоту построения

Библиография

Ключевые связанные работы

  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"

Теоретические основы

  1. Fredman & Komlós: Теоретический нижний предел для идеальных хеш-функций
  2. Belazzougui et al.: Основополагающие работы по методам размещения в корзинах

Статья PHast демонстрирует, что в области алгоритмической инженерии простые методы, тщательно оптимизированные с учетом сущности проблемы и характеристик современного оборудования, могут достичь или даже превзойти производительность сложных методов. Это предоставляет важное понимание для проектирования структур данных: ключ к решению проблемы часто заключается не в добавлении сложности, а в нахождении правильного направления упрощения.