Идеальный генератор хеш-функций для функций
У меня есть набор функций 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}
)? Решением излишней может быть перечисление всех функций, определенных в программе, но это может привести к огромным потерям памяти.