Partilhar via


moduloObjectHashcode MDA

Nota

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

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

Sintomas

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

  • O programa está recebendo o objeto errado de um Hashtablearquivo .

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

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

  • Dois objetos que antes não eram iguais agora são iguais.

Motivo

Seu programa pode estar recebendo o objeto errado de um Hashtable porque a implementação do Equals método na classe para a chave nos testes de igualdade de objetos, Hashtable comparando os resultados da chamada com o GetHashCode método. Os códigos hash não devem ser usados para testar a igualdade de objetos porque dois objetos podem ter o mesmo código hash, mesmo que seus respetivos campos tenham valores diferentes. Essas colisões de código hash, embora raras na prática, ocorrem. O efeito que isso tem em uma Hashtable pesquisa é que duas chaves que não são iguais parecem ser iguais, e o objeto errado é retornado do Hashtable. Por motivos de desempenho, a implementação do pode mudar entre versões de tempo de GetHashCode execução, portanto, colisões que podem não ocorrer em uma versão podem ocorrer em versões subsequentes. Habilite este MDA para testar se seu código tem bugs quando os códigos hash colidem. Quando habilitado, esse MDA faz com que o GetHashCode método retorne 0, resultando em todos os códigos hash colidindo. O único efeito que a ativação deste MDA deve ter no seu programa é que o seu programa é executado mais lentamente.

A ordem de enumeração de a Hashtable pode mudar de uma versão do tempo de execução para outra se o algoritmo usado para calcular os códigos hash para a mudança de chave. Para testar se o programa dependeu da 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 Object.Equals método 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 no tempo de execução

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

Saída

Não há saída para este MDA.

Configuração

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

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

Consulte também