Hashes von Klassen
-
"Ein Hash ist der erste Eindruck den man von einem Wert/ einer Variablen hat"
So stehts in meinem Buch.
Jetzt habe ich mehrere Hashfunktionen im Netz gefunden, aber alle verlassen sich darauf, dass das Objekt (die Klasse) einen String als Namen hat. Das ist aber bei mir nicht der Fall. Mit zufälligen Buchstaben hintendran wird mir die Hashfunktion zu langsam bzw zu klobig. Die sitzt in der Basisklasse für ein etwas größeres Projekt.
Nun hab ich einfach folgendes gemacht:u32 m_hash: void CalculateHash() { m_hash = (u32)this; } u32 GetHash() { return m_hash; }Grund: Bei Hashes möchte man möglichst keine Kollisionen. Die Speicheradressen sind mWn einzigartig, solange die Objekte am leben sind. Also hat man doch einen eindeutigen Hash solange das Objekt lebt.. richtig oder Denkfehler?
Grüße
Nico
-
Und was machst du bei zwei Objekten, die für sich genommen identisch sind?
Die würden so ja nicht den gleichen Hash aufweisen, sollten sie aber.
-
Wie halleur sagte, brauchst du da schon einen eindeutigen Algorithmus, damit gleiche Objekte auch den gleichen Hash erzeugen. Zudem sind die Adressen bei jedem Programmaufruf anders, du könntest die Hashes also nicht länger als ein Programm aufbewahren. Selbst während des Programmablaufes könnte ein Objekt erstellt werden, das an die gleiche Adresse wie ein zuvor erstelltes und wieder gelöschtes kommt, das sich aber vom vorherigen unterscheidet. Adressen sind also nicht so geeignet, wie sie auf den ersten Blick scheinen...
Abgesehen davon gibt es einige Unschönheiten in deinem Code:
u32 m_hash: // ich denke, das ist ein Kopierfehler, oder? void CalculateHash() { m_hash = (u32)this; // in C++ sollte man die entsprechenden Casts verwenden }
-
Warum willst du überhaupt den Umweg über nen Hash gehen? Es geht doch viel einfacher, wenn du einfach über ne std::map gehst? Oder baust dir selbst nen map-ähnliches konstrukt, wenn du willst... musst du wissen ^^
bb