Angenommen, ich habe eine Liste von N Zeichenfolgen, die zur Kompilierzeit bekannt sind.Erzeugen einer perfekten Hash-Funktion bei bekannter String-Liste?
Ich möchte (zur Kompilierzeit) eine Funktion generieren, die jeden String auf eine bestimmte ganze Zahl zwischen 1 und N einschließlich abbildet. Die Funktion sollte sehr wenig Zeit oder Platz zur Ausführung benötigen.
Angenommen, meine Saiten sind:
{"apple", "orange", "banana"}
Eine solche Funktion zurückgeben kann:
f("apple") -> 2
f("orange") -> 1
f("banana") -> 3
Was ist eine Strategie, um diese Funktion zu generieren?
Ich dachte, um die Zeichenfolgen zur Kompilierzeit zu analysieren und nach ein paar Konstanten zu suchen, die ich oder durch etwas hinzufügen oder hinzufügen könnte?
Die Zeit/Raum zum Generieren der Kompilierung kann ziemlich teuer sein (aber offensichtlich nicht lächerlich).
Warum verwenden Sie nicht bekannte Hash-Funktion wie murmur2 und dann mod das Ergebnis von 'N'? –
@NiyokoYuliawan: Das wäre nicht perfekt, oder? Wir wollen keine Kollisionen haben. Für zwei verschiedene Strings a, b: f (a) muss nicht gleich f (b) –
Ich denke, das sollte Ihr Problem lösen http://burtleburtle.net/bob/hash/perfect.html (wenn ich es richtig verstehe). – Martin