Laden...

[erledigt] System.Type.GetHashCode unique?

Erstellt von dein.Tod vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.357 Views
D
dein.Tod Themenstarter:in
69 Beiträge seit 2008
vor 14 Jahren
[erledigt] System.Type.GetHashCode unique?

Hallo zusammen,

Also in einem meiner Programme speichere ich für jeden Typ ein bestimmtes Objekt in ein Dictionary, als Key wollte ich ursprünglich Type.GUID verwenden bis ich gemerkt habe das diese Property verdammt langsam ist. Imo verwende ich als Key des Dictionarys die Referenz des Typs was ja ohne weiteres geht da es jedes Type-Objekt ja nur ein mal gibt.

Allerdings - ich weiß nicht, per referenz indentifizieren ist irgentwie so unschön ^^. Habe jetzt gesehen das Type.GetHashCode() überschrieben ist. (Und auch genauso schnell wie referenz).

Weiß jemand von euch ob der Type HashCode unique ist? Im MSDN stand nichts dazu.

Bei Risiken oder Nebenwirkungen fressen sie die Packungsbeilage oder schlagen sie ihren Arzt mit ihrem Apoteker.

N
228 Beiträge seit 2005
vor 14 Jahren

GetHashCode ist nicht zwingend eindeutig:
Object.GetHashCode Method

Schöne Grüße,
Mario

U
282 Beiträge seit 2008
vor 14 Jahren

Habe jetzt gesehen das Type.GetHashCode() überschrieben ist. (Und auch genauso schnell wie referenz).

Das ist auch nicht besonders verwunderlich, weil die Indizierung per Referenz nichts anderes macht, als GetHashCode aufzurufen.

Insofern ist die Methode mit "Type" als Key schon die (IMHO einzig) richtige Wahl. Wenn du nur nach GetHashCode indizierst, dann musst du dich selbst um Hash-Kollisionen kümmern. Aber am Ende ist das genau das, was ein Dictionary eben von Hause aus relativ effizient tut.

D
dein.Tod Themenstarter:in
69 Beiträge seit 2008
vor 14 Jahren

gut dann wäre das geklart.

Bei Risiken oder Nebenwirkungen fressen sie die Packungsbeilage oder schlagen sie ihren Arzt mit ihrem Apoteker.

3.971 Beiträge seit 2006
vor 14 Jahren

Erstell dir ein IEqualityComparer und übergib eine Instanz deinem Dictionary im Konstruktor.

Für Equals verwendest du Object.Equals(object, object) und für GetHashCode kannst du RuntimeHelpers::GetHashCode-Methode (Object) verwenden.

Damit hättest du immer einen eindeutigen Key (Object-/Referenzgleichheit)

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo kleines_eichhoernchen,

alles steht und fällt doch damit, ob es für jeden Typ nur ein zugehöriges Objekt gibt. Sprich, dass wenn man mehrmals z.B. typeof (String) abruft, man immer ein und dasselbe Type-Objekt zurückbekommt. Oder wenn nicht, wenigstens Type.Equals und Type.GetHashCode so implementiert sind, dass die ganzen Objekte als gleich angesehen werden.

Wenn das so ist, kann man die Type.Objekte direkt als Key verwenden. Wenn nicht, verbessert dein Vorschlag die Situation nicht ... zumindest wenn ich nichts wesentliches übersehe.

herbivore