Gerador de função hash perfeito para funções
Eu tenho um conjunto de funções C ++. Quero mapear essas funções em uma tabela de hash, algo como:unordered_map<function<ReturnType (Args...)> , SomethingElse>
, OndeSomethingElse
não é relevante para esta pergunta.
Esse conjunto de funções é conhecido anteriormente, pequeno (digamos menos de 50) e estático (não vai mudar).
Como o desempenho da pesquisa é crucial (deve ser executado emO(1)
), Quero definir uma função de hash perfeita.
Existe um gerador de função de hash perfeito para esse cenário?
Eu sei que existem geradores de funções de hash perfeitas (comoGPERF ouCMPH) mas como nunca os usei, não sei se eles são adequados para o meu caso.
RAZÃO, MOTIVO:
Estou tentando criar uma estrutura em que, dado um programa escrito em C ++, o usuário possa selecionar um subconjuntoF
das funções definidas neste programa.
Para cadaf
pertencendo àF
, a estrutura implementa ummemorização estratégia: quando chamamosf
com entradai
nós armazenamos(i,o)
dentro de alguma estrutura de dados. Então, se vamos ligar novamentef
comi
, nós vamos voltaro
sem executar novamente o cálculo (caro).
Os "resultados já calculados" serão compartilhados entre diferentes usuários (talvez na nuvem), portanto, se o usuáriou1
já calculouo
, do utilizadoru2
economizará tempo de computação chamandof
comi
(usando a mesma anotação de antes).
Obviamente, precisamos armazenar o conjunto de pares(f,inputs_sets)
(Ondeinputs_sets
é o conjunto de resultados já calculados que falei antes),qual é a pergunta original: como faço?
Portanto, usar o "truque de enumeração" proposto nos comentários nesse cenário pode ser uma solução, assumindo que todos os usuários usem oexatamente o mesmo enumeração, o que poderia ser um problema: supondo que nosso programa tenhaf1
,f2
,f3
e seu1
quer memorizar apenasf1
ef2
(tãoF={f1,f2}
), enquantou2
quer memorizar apenasf3
(tãoF={f3}
)? Uma solução exagerada poderia ser enumerar todas as funções definidas no programa, mas isso poderia gerar um enorme desperdício de memória.