Fangen wir einmal von vorne an:
- Ein Dictionary ist eine Key-Value-Menge
- Für die Einsortierung braucht das Dictionary einen IEqualityComparer<TKey>
- Dieser Comparer liefert für den Key eine Hash-Funktion und eine Gleichheits-Funktion
Wenn jetzt der Key von
TObject
abgleitet ist (also eine Klasse), dann geht der Standard-EqualityComparer auf die Methoden:
Delphi-Quellcode:
function TObject.Equals( Obj:TObject ) : Boolean; virtual;
function TObject.GetHashCode() : Integer; virtual;
Wenn
TObject.GetHashCode
nicht überschrieben wurde, dann wird dort der Referenz-Zeiger als Integer-Wert zurückgeliefert (bei x64 etwas anders).
Somit haben wir dort
garantiert keine Kollisionen.
Das wollte ich damit nur zeigen. Keine Kollisionen -> Dictionary ganz schnell.
Wird das Dictionary langsam, dann hat man Mukrs beim HashCode gebaut.
Und
TDictionary<TObject,Integer>
ist absolut bewusst, da ich das Dictionary hier als ein
HashSet missbrauche.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)