Perfekter Hash-Funktionsgenerator für Funktionen

Ich habe eine Reihe von C ++ - Funktionen. Ich möchte diese Funktionen in einer Hash-Tabelle abbilden, so etwas wie:unordered_map<function<ReturnType (Args...)> , SomethingElse>, woSomethingElse ist für diese Frage nicht relevant.

Dieser Satz von Funktionen ist bisher bekannt, klein (sagen wir weniger als 50) und statisch (wird sich nicht ändern).

Da die Suchleistung von entscheidender Bedeutung ist (sollte in @ durchgeführt werdO(1)), Ich möchte eine perfekte Hash-Funktion definieren.

Es gibt einen perfekten Hash-Funktionsgenerator für dieses Szenario?

Ich weiß, dass es Generatoren für perfekte Hashing-Funktionen gibt (wie GPERF oder CMPH) aber da ich sie noch nie benutzt habe, weiß ich nicht, ob sie für meinen Fall geeignet sind.

GRUND

Ich versuche, ein Framework zu entwerfen, in dem der Benutzer bei einem in C ++ geschriebenen Programm eine Teilmenge auswählen kann.F der in diesem Programm definierten Funktionen.

Für jedesf zugehörigF, das Framework implementiert ein memoization strategie: wenn wir @ anruff mit Eingabei, wir speichern(i,o) innerhalb einer Datenstruktur. Also, wenn wir AGAIN @ anrufen wollf miti, wir werden zurück kommeno ohne die (zeitaufwändige) Berechnung erneut durchzuführen.

Die "bereits berechneten Ergebnisse" werden zwischen verschiedenen Benutzern (möglicherweise in der Cloud) geteilt. Wenn also Benutzeru1 hat bereits @ berechno, Benutzeru2 spart Rechenzeit beim Anrufenf miti (mit der gleichen Anmerkung von vorher).

Offensichtlich müssen wir die Menge der Paare speichern(f,inputs_sets) (woinputs_sets ist die bereits berechnete Ergebnismenge, mit der ich zuvor gesprochen habe),was ist die ursprüngliche Frage: Wie mache ich das?

So könnte die Verwendung des in den Kommentaren in diesem Szenario vorgeschlagenen "Aufzählungstricks" eine Lösung sein, vorausgesetzt, alle Benutzer verwenden dasgenau dasselb Aufzählung, die ein Problem sein könnte: Angenommen, unser Programm hatf1,f2,f3 Was wäre wennu1 will nur merkenf1 undf2 (soF={f1,f2}), währendu2 will nur merkenf3 (soF={f3})? Eine Overkill-Lösung könnte darin bestehen, alle im Programm definierten Funktionen aufzulisten. Dies könnte jedoch zu einer enormen Verschwendung von Speicher führen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage