Да, вы можете создать минимальную идеальную хеш-функцию (MPHF) во время выполнения. Вы можете использовать несколько алгоритмов, но большинство из них немного сложны для реализации, поэтому я не могу дать вам рабочий пример кода. Многие из них реализованы в cmph проекте .
Самый простой, вероятно, BDZ. На высоком уровне поиск требует вычисления 3 хеш-функций и 3 обращений к памяти. Если память не проблема, вам нужно только 2. Она поддерживает миллионы ключей. Этот алгоритм требует таблицу поиска, которая примерно в 1,23 раза превышает количество записей.
Есть и другие алгоритмы, один из которых я сам изобрел, алгоритм RecSplit , но у меня нет реализации на C, только Java прямо сейчас. По сути, алгоритмы находят способ разбить набор на подмножества (рекурсивно), пока размер подмножества не станет равным 1. Вам нужно помнить, как вы разбиваете. На самом деле самое простое решение - это использовать справочную таблицу для «как вы разбиваете», но таблица действительно мала, возможно, всего 5 целых чисел для 64 ключей. Первый разделить на 4 подмножества по 16, и 4 для сопоставления каждого подмножества с числом 0..15.
(Я добавил второй ответ, если вам строго не нужна минимальная идеальная хеш-функция, просто идеальная хеш-функция. Построение проще и поиск выполняется намного быстрее, но требует большего массива.)