Идеальный генератор хеш-функций для функций

У меня есть набор функций C++. Я хочу отобразить эти функции в хэш-таблице, что-то вроде: unordered_map<function<ReturnType (Args...)> , SomethingElse>, где SomethingElse не имеет отношения к этому вопросу.

Этот набор функций ранее известен, маленький (скажем, менее 50) и статический (не изменится).

Поскольку производительность поиска имеет решающее значение (должны быть выполнены в O(1)), Я хочу определить идеальную функцию хеширования.

Существует ли идеальный генератор хеш-функций для этого сценария?

Я знаю, что существуют совершенные генераторы хеш-функций (например, GPERF или CMPH), но так как я никогда не использовал их, я не знаю, подходят ли они для моего случая.

ПРИЧИНА:

Я пытаюсь разработать структуру, где, учитывая программу, написанную на C++, пользователь может выбрать подмножество F функций, определенных в этой программе.

Для каждого f принадлежность к F, структура реализует стратегию запоминания: когда мы называем f с вводом iмы храним (i,o) внутри некоторой структуры данных. Итак, если мы собираемся позвонить снова f с i, мы вернемся o без повторного выполнения (дорогостоящего времени) вычисления.

"Уже рассчитанные результаты" будут доступны для разных пользователей (возможно, в облаке), поэтому, если пользователь u1 уже вычислил oпользователь u2 сэкономит время вычислений f с i (используя ту же аннотацию до).

Очевидно, нам нужно хранить множество пар (f,inputs_sets) (где inputs_sets это уже вычисленный набор результатов, о котором я говорил ранее), что является первоначальным вопросом: как мне это сделать?

Таким образом, использование "трюка перечисления", предложенного в комментариях к этому сценарию, могло бы стать решением, предполагая, что все пользователи используют одно и то же перечисление, что может быть проблемой: предположим, что наша программа имеет f1,f2,f3 что, если u1 хочет только запомнить f1 а также f2 (так F={f1,f2}), в то время как u2 хочет только запомнить f3 (так F={f3})? Решением излишней может быть перечисление всех функций, определенных в программе, но это может привести к огромным потерям памяти.

1 ответ

Решение

Хорошо, может быть, не то, что вы хотите услышать, но подумайте об этом: поскольку вы говорите о нескольких функциях, менее 50, поиск хеша должен быть незначительным даже при столкновениях. Вы на самом деле профилировали и видели, что поиск имеет решающее значение?

Поэтому я советую сосредоточить свою энергию на чем-то другом, скорее всего, идеальная хеш-функция не принесет какого-либо улучшения производительности в вашем случае.

Я собираюсь сделать еще один шаг вперед и сказать, что я считаю, что для менее чем 50 элементов плоская карта vector) будет иметь аналогичную производительность (или, возможно, даже лучше из-за локальности кэша). Но опять же, измерения необходимы.

Другие вопросы по тегам