Delen via


moduloObjectHashcode MDA

Notitie

Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.

De moduloObjectHashcode beheerde foutopsporingsassistent (MDA) wijzigt het gedrag van de Object klasse om een modulo-bewerking uit te voeren op de hash-code die door de GetHashCode methode wordt geretourneerd. De standaardmodulatie voor deze MDA is 1, wat ervoor zorgt dat GetHashCode 0 voor alle objecten wordt geretourneerd.

Symptomen

Na het overstappen op een nieuwe versie van common language runtime (CLR), wordt een programma niet meer goed uitgevoerd:

  • Het programma krijgt het verkeerde object van een Hashtable.

  • De volgorde van opsomming van een Hashtable heeft een wijziging die het programma onderbreekt.

  • Twee objecten die vroeger gelijk waren, zijn niet meer gelijk.

  • Twee objecten die voorheen niet gelijk waren, zijn nu gelijk.

Oorzaak

Uw programma krijgt mogelijk het verkeerde object van een Hashtable omdat de implementatie van de Equals methode op de klasse voor de sleutel in de Hashtable tests voor gelijkheid van objecten wordt uitgevoerd door de resultaten van de aanroep te vergelijken met de GetHashCode methode. Hash-codes mogen niet worden gebruikt om te testen op object gelijkheid, omdat twee objecten mogelijk dezelfde hashcode hebben, zelfs niet als hun respectieve velden verschillende waarden hebben. Deze hash-codeconflicten, hoewel zelden in de praktijk, optreden. Het effect dat dit heeft op een Hashtable zoekactie is dat twee sleutels die niet gelijk lijken te zijn, gelijk lijken te zijn en het verkeerde object wordt geretourneerd van de Hashtable. Om prestatieredenen kan de implementatie van GetHashCode runtimeversies veranderen, zodat conflicten die zich mogelijk niet op één versie voordoen, zich in volgende versies kunnen voordoen. Schakel deze MDA in om te testen of uw code fouten bevat wanneer hash-codes botsen. Wanneer deze functie is ingeschakeld, zorgt deze MDA ervoor dat de GetHashCode methode 0 retourneert, wat resulteert in een conflict met alle hash-codes. Het enige effect dat deze MDA inschakelt in uw programma, is dat uw programma langzamer wordt uitgevoerd.

De volgorde van opsomming van een kan veranderen van de Hashtable ene versie van de runtime naar een andere als het algoritme dat wordt gebruikt voor het berekenen van de hash-codes voor de sleutelwijziging. Als u wilt testen of uw programma afhankelijk is geworden van de volgorde van opsomming van sleutels of waarden uit een hash-tabel, kunt u deze MDA inschakelen.

Oplossing

Gebruik nooit hashcodes als vervanging voor objectidentiteit. Implementeer de onderdrukking van de Object.Equals methode om hash-codes niet te vergelijken.

Maak geen afhankelijkheden op basis van de volgorde van opsommingen van sleutels of waarden in hashtabellen.

Effect op de runtime

Toepassingen worden langzamer uitgevoerd wanneer deze MDA is ingeschakeld. Deze MDA gebruikt gewoon de hash-code die zou zijn geretourneerd en retourneert in plaats daarvan de rest wanneer deze wordt gedeeld door een modulus.

Uitvoer

Er is geen uitvoer voor deze MDA.

Configuratie

Het modulus kenmerk geeft de modulus op die worden gebruikt voor de hash-code. De standaardwaarde is 1.

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

Zie ook