Partilhar via


moduloObjectHashcode MDA

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

Sintomas

Depois de mover para uma nova versão do common language runtime (CLR), um programa não executa 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 usados para ser igual não são iguais.

  • Agora, dois objetos usados para não ser iguais são iguais.

Causa

Seu programa pode estar recebendo o objeto errado de um Hashtable porque a implementação da Equals método na classe para a chave para o Hashtable testes de igualdade de objetos, comparando os resultados da chamada para o GetHashCode método. Códigos de hash não devem ser usados para testar igualdade de objeto porque dois objetos podem ter o mesmo código de hash, mesmo que seus respectivos campos tem valores diferentes. Essas colisões de código hash, embora seja raro, na prática, ocorrem. O efeito disso em um Hashtable pesquisa é que aparecem de duas chaves que não são iguais para que seja igual, e o objeto incorreto é retornado de Hashtable. Por motivos de desempenho, a implementação de GetHashCode pode alterar entre versões do runtime, portanto, o que poderão não ocorrer em uma versão de colisões podem ocorrer em versões subseqüentes. Habilite este MDA testar se o seu código possui bugs quando os códigos de hash entrarem em conflito. Quando ativado, este MDA faz com que o GetHashCode método para retornar 0, resultando em todos os códigos de hash se unindo. Habilitação de efeito somente que este MDA deverá ter em seu programa é que o programa seja executado mais lentamente.

A ordem de enumeração de um Hashtable pode mudar de uma versão de tempo de execução para outro se o algoritmo usado para computar os códigos de hash para alterar a chave. Para testar se o seu programa adotou uma dependência na ordem de enumeração de chaves ou valores de uma tabela de hash, você pode habilitar este MDA.

Resolução

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

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

Efeito sobre o tempo de execução.

Aplicativos são executados mais lentamente quando este MDA está habilitado. Este MDA simplesmente utiliza o código de hash que poderia ter retornado e, em vez disso, retorna o resto quando dividido por um módulo.

Saída

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

Configuração

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

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

Consulte também

Referência

Object.GetHashCode

Object.Equals

Conceitos

Diagnosticar erros com assistentes de depuração gerenciada