Was sind einige gute Methoden, um String-Namen durch Integer-Hashes zu ersetzen

8

Normalerweise haben Entitäten und Komponenten oder andere Teile des Spielcodes im datengesteuerten Design Namen, die überprüft werden, wenn Sie herausfinden wollen, mit welchem ​​Objekt Sie es genau tun.

%Vor%

Wenn Sie die Möglichkeit, dass dies eine vorzeitige Optimierung sein könnte, ignorieren, ist es ziemlich klar, dass Nachschlagen von Entitäten viel schneller wäre, wenn ihr "Name" ein einfacher 32-Bit-Wert anstelle einer tatsächlichen Zeichenfolge wäre.

Computing Hashes aus den String-Namen ist eine mögliche Option. Ich habe es nicht wirklich versucht, aber mit einer Reichweite von 32 Bit und einer guten Hash-Funktion sollte das Risiko einer Kollision minimal sein.

Die Frage ist: Offensichtlich brauchen wir einen Weg, String-Namen in Code (oder in einer Art externer Datei) in diese Ganzzahlen umzuwandeln, da die Person, die an diesen benannten Objekten arbeitet, immer noch auf das Objekt verweisen will als "Wächter" anstelle von "0x2315f21a".

Wenn wir davon ausgehen, dass wir C ++ verwenden und alle im Code enthaltenen Strings ersetzen wollen, können wir dies sogar mit in Sprachen integrierten Funktionen erreichen oder müssen wir ein externes Tool erstellen, das alle Dateien manuell durchgeht und die Daten austauscht Werte?

    
TravisG 04.01.2012, 16:39
quelle

4 Antworten

10

Jason Gregory schrieb dies auf sein Buch :

  

Bei Naughty Dog haben wir eine Variante des CRC-32-Algorithmus verwendet, um unsere Strings zu hacken, und wir haben in zwei Jahren Entwicklung auf Uncharted: Drakes Fortune keine einzige Kollision erlebt.

Vielleicht möchten Sie sich das genauer ansehen.

Und über den Build-Schritt, den du erwähnt hast, hat er auch darüber gesprochen. Sie kapseln im Grunde die Strings, die in etwas hashed werden müssen:

%Vor%

Und verwenden Sie ein externes Tool zur Build-Zeit, um alle Vorkommen zu hasen. Auf diese Weise vermeiden Sie Laufzeitkosten.

    
David Gouveia 04.01.2012, 16:53
quelle
1

Dafür gibt es Enums. Ich würde es nicht wagen zu entscheiden, welche Ressource für das Thema am besten ist, aber es gibt eine große Auswahl: Ссылка

    
aaaaaaaaaaaa 04.01.2012 16:50
quelle
0

Ich würde sagen, gehen Sie mit enums!

Aber wenn Sie bereits eine Menge Code haben, der bereits Strings verwendet, dann behalten Sie es entweder so (einfach und gewöhnlich genug schnell auf einem PC) oder hacken Sie es mit einer Art CRC oder MD5 zu einer Ganzzahl.

>     
Valmond 04.01.2012 18:34
quelle
0

Dies wird grundsätzlich gelöst, indem eine Indirektion über eine Hash-Map hinzugefügt wird.

Angenommen, Sie möchten Zeichenfolgen in ganze Zahlen konvertieren:

  • Schreiben Sie eine Klasse umschließt sowohl ein Array als auch eine Hash-Map. Ich nenne diese Klassen Wörterbücher.
  • Das Array enthält die Zeichenfolgen.
  • Der Schlüssel der Hash-Map ist die Zeichenfolge (geteilte Zeiger oder stabile Arrays, in denen auch rohe Zeiger sicher sind)
  • Der Wert der Hash-Map ist der Index in dem Array, in dem sich die Zeichenfolge befindet. Dies ist auch das undurchsichtige Handle, das sie zum aufrufenden Code zurückgibt.
  • Wenn eine neue Zeichenfolge zum System hinzugefügt wird, wird nach der bereits vorhandenen in der hashmap gesucht, und das Handle zurückgegeben, falls vorhanden.
  • Wenn das Handle nicht vorhanden ist, fügen Sie die Zeichenfolge zum Array hinzu, der Index ist das Handle.
  • Legen Sie die Zeichenfolge und das Handle in der Map fest und geben Sie den Handle zurück.

Anmerkungen / Vorbehalte:

  • Diese Strategie führt dazu, dass die Zeichenkette vom Handle in konstanter Zeit zurückgegeben wird (es handelt sich lediglich um eine Array-Deference).
  • Handle-Bezeichner werden zuerst geliefert, aber wenn Sie die Strings statt der Werte serialisieren, spielt das keine Rolle.
  • Überladungen von Operator [] für den Schlüssel und den Wert sind ziemlich einfach (neue Strings registrieren oder die Strings zurückholen), aber das Umbrechen des Handles mit einer benutzerdefinierten Klasse (das Umschließen eines Integers) fügt viel benötigtes hinzu Geben Sie Sicherheit ein und vermeiden Sie Mehrdeutigkeiten, wenn Sie möchten, dass der Schlüssel und die Werte dieselben Typen sind (überladene [] wird nicht kompiliert und usw.)
  • Sie müssen die Zeichenfolgen im RAM speichern, was ein Problem sein kann.
Zoner 30.01.2012 04:53
quelle

Tags und Links