Compartilhar via


MDA moduloObjectHashcode

Observação

Este artigo é específico para aplicativos .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O MDA (Assistente de Depuração Gerenciado) de moduloObjectHashcode altera o comportamento da classe Object para executar uma operação de módulo no código hash retornado pelo método GetHashCode. O módulo padrão para esse MDA é 1, o que faz com que GetHashCode retorne 0 para todos os objetos.

Sintomas

Depois de migrar para uma nova versão do CLR (Common Language Runtime), um programa não é mais executado corretamente:

  • O programa está obtendo o objeto errado de um Hashtable.

  • A ordem de enumeração de um Hashtable tem uma alteração que interrompe o programa.

  • Dois objetos que costumavam ser iguais não o são mais.

  • Dois objetos que costumavam não ser iguais agora o são.

Causa

Seu programa pode estar obtendo o objeto errado de um Hashtable porque a implementação do método Equals na classe para a chave no Hashtable testa a igualdade de objetos ao comparar os resultados da chamada para o método GetHashCode. Códigos hash não devem ser usados para testar a igualdade de objetos porque os dois objetos podem ter o mesmo código hash, mesmo que seus respectivos campos tenham valores diferentes. Esses conflitos de código hash, embora raros na prática, ocorrem. O efeito disso em uma pesquisa Hashtable é que duas chaves que não são iguais parecem ser e o objeto errado é retornado do Hashtable. Por motivos de desempenho, a implementação de GetHashCode pode variar entre as versões de runtime, então colisões que podem não ocorrer em uma versão podem ocorrer em versões subsequentes. Quando códigos hash entrarem em conflito, habilite esse MDA para testar se o seu código tem bugs. Quando habilitado, esse MDA faz com que o método GetHashCode retorne 0, resultando em uma colisão de todos os códigos hash. O único efeito que habilitar esse MDA deve ter em seu programa é tornar a execução dele mais lenta.

A ordem de enumeração de um Hashtable poderá variar de uma versão de runtime para outra se o algoritmo usado para calcular os códigos hash para a chave for alterado. Para testar se o seu programa obteve uma dependência na ordem de enumeração de chaves ou valores de uma tabela de hash, você pode habilitar esse MDA.

Resolução

Nunca use códigos hash como um substituto para a identidade do objeto. Implemente a substituição do método Object.Equals para não comparar códigos hash.

Não crie dependências na ordem das enumerações de chaves ou valores em tabelas de hash.

Efeito sobre o runtime

Os aplicativos são executados mais lentamente quando esse MDA está habilitado. Esse MDA simplesmente usa o código hash que teria sido retornado e em vez disso, retorna o resto quando dividido por um módulo.

Saída

Não há nenhuma saída para esse MDA.

Configuração

O atributo modulus especifica o módulo usado no código hash. O valor padrão é 1.

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

Confira também