Sdílet prostřednictvím


moduloObjectHashcode – pomocník spravovaného ladění (MDA)

Poznámka:

Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.

Pomocník moduloObjectHashcode spravovaného ladění (MDA) změní chování Object třídy na provedení operace modulo s kódem hash vráceným metodou GetHashCode . Výchozí modul pro tento mdA je 1, což způsobí GetHashCode vrácení 0 pro všechny objekty.

Příznaky

Po přechodu na novou verzi modulu CLR (Common Language Runtime) se program už nespustí správně:

  • Program získává nesprávný objekt z objektu Hashtable.

  • Pořadí výčtu z a má Hashtable změnu, která program přeruší.

  • Dva objekty, které se používají ke rovna, už se nerovnají.

  • Dva objekty, které se dříve nerovnají, jsou teď stejné.

Příčina

Váš program může dostat nesprávný objekt z důvodu Hashtable implementace Equals metody ve třídě pro klíč do Hashtable testů rovnosti objektů porovnáním výsledků volání metody s metodou GetHashCode . Kódy hash by neměly být použity k testování rovnosti objektů, protože dva objekty mohou mít stejný hashovací kód, i když jejich příslušná pole mají různé hodnoty. K těmto kolizím kódu hash, i když v praxi dochází jen zřídka. Účinek, který má na Hashtable vyhledávání je, že dva klíče, které se nerovnají, se zdá být stejné a nesprávný objekt je vrácen z Hashtable. Z důvodů výkonu se implementace GetHashCode může mezi verzemi modulu runtime změnit, takže kolize, ke kterým nemusí dojít v jedné verzi, může dojít v následujících verzích. Povolte tuto správu mobilních zařízení a otestujte, jestli kód obsahuje chyby, když se kódy hash shromáždí. Pokud je tato funkce MDA povolená, metoda GetHashCode vrátí hodnotu 0, což vede ke kolidování všech kódů hash. Jediným účinkem, který povolí tento mdA, by měl být ve vašem programu, je, že program běží pomaleji.

Pořadí výčtu z modulu Hashtable runtime se může změnit z jedné verze modulu runtime na jinou, pokud algoritmus použitý k výpočtu kódů hash pro změnu klíče. Pokud chcete otestovat, jestli váš program převzal závislost na pořadí výčtu klíčů nebo hodnot z tabulky hash, můžete tuto správu MDA povolit.

Rozlišení

Nikdy nepoužívejte hashové kódy jako náhradu za identitu objektu. Implementujte přepsání Object.Equals metody tak, aby nerovnály kódy hash.

Nevytvádřujte závislosti v pořadí výčtů klíčů nebo hodnot v tabulkách hash.

Vliv na modul runtime

Aplikace běží pomaleji, když je tato funkce MDA povolená. Tento kód MDA jednoduše vezme kód hash, který by se vrátil, a místo toho vrátí zbytek při dělení modulem.

Výstup

Pro tento MDA neexistuje žádný výstup.

Konfigurace

Atribut modulus určuje moduly používané v kódu hash. Výchozí hodnota je 1.

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

Viz také