Dela via


moduloObjectHashcode MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den moduloObjectHashcode hanterade felsökningsassistenten (MDA) ändrar beteendet Object för klassen för att utföra en modulo-åtgärd på den hash-kod som returneras av GetHashCode metoden. Standardmodulus för denna MDA är 1, vilket gör GetHashCode att 0 returneras för alla objekt.

Symtom

När du har flyttat till en ny version av CLR (Common Language Runtime) körs inte längre ett program korrekt:

  • Programmet får fel objekt från en Hashtable.

  • Uppräkningsordningen från en Hashtable har en ändring som bryter programmet.

  • Två objekt som tidigare var lika med är inte längre lika.

  • Två objekt som tidigare inte var lika med är nu lika.

Orsak

Ditt program kan få fel objekt från en Hashtable eftersom implementeringen av Equals metoden på klassen för nyckeln i testerna Hashtable för likhet av objekt genom att jämföra resultatet av anropet med GetHashCode metoden. Hash-koder bör inte användas för att testa objektjämlikhet eftersom två objekt kan ha samma hash-kod även om deras respektive fält har olika värden. Dessa hash-kodkollisioner, även om de är sällsynta i praktiken, inträffar. Effekten detta har på ett Hashtable uppslag är att två nycklar som inte är lika med verkar vara lika och att fel objekt returneras från Hashtable. Av prestandaskäl kan implementeringen av GetHashCode ändras mellan körningsversioner, så kollisioner som kanske inte inträffar på en version kan inträffa i efterföljande versioner. Aktivera denna MDA för att testa om koden har buggar när hash-koder kolliderar. När den här MDA:en är aktiverad returnerar metoden GetHashCode 0, vilket resulterar i att alla hash-koder kolliderar. Den enda effekt som aktiverar denna MDA bör ha på ditt program är att programmet körs långsammare.

Uppräkningsordningen från en Hashtable kan ändras från en version av körningen till en annan om algoritmen som används för att beräkna hash-koderna för nyckeländringen. Om du vill testa om programmet har varit beroende av ordningen på uppräkning av nycklar eller värden från en hashtabell kan du aktivera den här MDA:en.

Åtgärd

Använd aldrig hash-koder som ersättning för objektidentitet. Implementera åsidosättningen Object.Equals av metoden för att inte jämföra hash-koder.

Skapa inte beroenden i ordning på uppräkningar av nycklar eller värden i hash-tabeller.

Effekt på körningen

Program körs långsammare när denna MDA är aktiverad. Denna MDA tar helt enkelt den hash-kod som skulle ha returnerats och returnerar i stället resten när det divideras med en modulus.

Output

Det finns inga utdata för denna MDA.

Konfiguration

Attributet modulus anger modulus som används på hash-koden. Standardvärdet är 1.

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

Se även