Freigeben über


moduloObjectHashcode-MDA

Der moduloObjectHashcode-MDA (Assistent für verwaltetes Debuggen) ändert das Verhalten der Object-Klasse, um einen Modulo-Vorgang auf dem Hashcode auszuführen, der von der GetHashCode-Methode zurückgegeben wurde. Der Standard-Modulo dieses MDA beträgt 1, wodurch GetHashCode für alle Objekte 0 zurückgibt.

Symptome

Nachdem das Programm auf eine neue Version der Common Language Runtime (CLR) verschoben wurde, wird es nicht mehr ordnungsgemäß ausgeführt:

  • Das Programm erhält das falsche Objekt aus einem Hashtable.

  • Die Reihenfolge der Enumeration aus einem Hashtable hat eine Änderung, die die Anwendung unterbricht.

  • Zwei Objekte, die gleich waren, sind nicht mehr gleich.

  • Zwei Objekte, die nicht gleich waren, sind nun gleich.

Ursache

Ihr Programm erhält möglicherweise das falsche Objekt aus einer Hashtable, da die Implementierung der Equals-Methode der Klasse für den Schlüssel in der Hashtable auf Objektgleichheit überprüft, indem die Ergebnisse des Aufrufs der GetHashCode-Methode verglichen werden. Hashcodes sollten nicht verwendet werden, um auf Objektgleichheit zu testen, da zwei Objekte denselben Hashcode haben können, auch wenn ihre jeweiligen Felder unterschiedliche Werte aufweisen. Diese Hashcodekonflikte sind in der Praxis zwar selten, aber sie kommen vor. Als Konsequenz gibt es zwei Schlüssel in einem Hashtable-Lookup, die nicht gleich sind, aber gleich zu sein scheinen, und das falsche Objekt wird aus der Hashtable zurückgegeben. Zur Verbesserung der Leistung kann sich die Implementierung der GetHashCode zwischen Laufzeitversionen unterscheiden, damit Konflikte, die auf einer Version nicht auftreten, in nachfolgenden Versionen auftreten können. Aktivieren Sie diesen MDA, um zu überprüfen, ob der Code Fehler aufweist, wenn Hashcodes in Konflikt stehen. Wenn dieser MDA aktiviert ist, gibt die GetHashCode-Methode 0 (null) zurück, was zu einer Kollision aller Hashcodes führt. Die einzige Auswirkung, die die Aktivierung dieses MDAs auf Ihr Programm haben sollte, ist die, dass das Programm langsamer ausgeführt wird.

Die Reihenfolge der Enumeration aus einem Hashtable kann sich möglicherweise von einer Laufzeitversion zur anderen ändern, wenn der Algorithmus für die Berechnung der Hashcodes für die Schlüsseländerung verwendet wird. Sie können diesen MDA aktivieren, um zu überprüfen, ob das Programm eine Abhängigkeit von der Reihenfolge der Enumeration der Schlüssel oder Werte aus einer Hashtabelle erstellt hat.

Lösung

Verwenden Sie niemals Hashcodes als Ersatz für die Objektidentität. Implementieren Sie die Außerkraftsetzung der Object.Equals-Methode, um Hashcodes nicht zu vergleichen.

Erstellen Sie keine Abhängigkeiten von der Reihenfolge der Schlüsselenumerationen oder Werte in Hashtabellen.

Auswirkungen auf die Laufzeit

Anwendungen werden langsamer ausgeführt, wenn dieser MDA aktiviert ist. Dieser MDA übernimmt lediglich den Hashcode, der zurückgegeben wurde und gibt stattdessen den Rest nach dem Dividieren durch einen Modulo zurück.

Output

Es gibt keine Ausgabe für diesen MDA.

Konfiguration

Das modulus-Attribut gibt den Modulo an, der auf dem Hashcode verwendet wird. Der Standardwert ist 1.

<mdaConfig>  
  <assistants>  
    <moduloObjectHashcode modulus="1" />  
  </assistants>  
</mdaConfig>  

Siehe auch