Wie eindeutig (und sicher) ist ein Key des Typs object?

21/05/2009 - 22:12 von Harald M. Genauck | Report spam
Hallo,

ich würde gerne in einer/m Collection/Dictionary, das beliebige Typen
als Key erlaubt (wie etwa Hashtable,
System.Collections.Generic.Dictionary<TKey, TValue> u.a.), einen Key
des Typs object verwenden.

Nun frage ich mich - und Euch -, wie eindeutig und sicher der Key wàre.

Falls im Dictionary intern der Hashcode des jeweiligen Objekts
verwendet werden sollte, dürfte das doch kaum eindeutig sein, da ja
bekanntlich selbst verschiedene Instanzen des gleichen Typs den
gleichen Hashcode liefern können - oder?


Viele Grüße

Harald M. Genauck

"VISUAL STUDIO one" - http://www.visualstudio1.de (Chefredakteur)
"ABOUT Visual Basic" - http://www.aboutvb.de (Herausgeber)
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
21/05/2009 - 23:22 | Warnen spam
Hallo Harald!

"Harald M. Genauck" schrieb:
ich würde gerne in einer/m Collection/Dictionary, das beliebige Typen als
Key erlaubt (wie etwa Hashtable,
System.Collections.Generic.Dictionary<TKey, TValue> u.a.), einen Key des
Typs object verwenden.

Nun frage ich mich - und Euch -, wie eindeutig und sicher der Key wàre.

Falls im Dictionary intern der Hashcode des jeweiligen Objekts verwendet
werden sollte, dürfte das doch kaum eindeutig sein, da ja bekanntlich
selbst verschiedene Instanzen des gleichen Typs den gleichen Hashcode
liefern können - oder?



Da bringt die Dokumentation zu 'Object.GetHashCode' Licht ins Dunkel. Kurz:
Man sollte Objekte nicht blindlings als Schlüssel in einer Hashtabelle
verwenden, da diese nur dann dafür geeignet sind, wenn die Methode
'GetHashCode' im Typ überschrieben und mit einer geeigneten Implementierung
versehen wurde. Hinweise zur Implementierung finden sich ebenfalls in der
Dokumentation zur Methode 'Object.GetHashCode'.

Hashfunktionen sollten so ausgerichtet sein, daß Kollisionen von Hashwerten
"selten" auftreten (also h(s) = h(t) ist "selten" der Fall bei s <> t).
Dennoch kann dies natürlich der Fall sein. In diesem Fall kann die
Hashtabelle z.B. wie folgt implementiert werden: Die Einràge selbst
enthalten ggf. eine lineare Liste von Werten, die im Falle von Kollisionen
zurückgegeben wird.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen