Comparteix a través de


MDA de moduloObjectHashcode

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El Asistente para la depuración administrada (MDA) moduloObjectHashcode cambia el comportamiento de la clase Object para realizar una operación de módulo en el código hash devuelto por el método GetHashCode. El módulo predeterminado para este MDA es 1, lo que hace que GetHashCode devuelva 0 para todos los objetos.

Síntomas

Después de moverlo a una nueva versión de Common Language Runtime (CLR), un programa ya no se ejecuta correctamente:

  • El programa está recibiendo el objeto equivocado desde una Hashtable.

  • El orden de enumeración de una Hashtable tiene un cambio que interrumpe el programa.

  • Dos objetos que solían ser iguales ya no lo son.

  • Dos objetos que solían ser no iguales ahora lo son.

Causa

El programa puede estar recibiendo el objeto equivocado desde Hashtable porque la implementación del método Equals en la clase para la clave en Hashtable comprueba la igualdad de objetos al comparar los resultados de la llamada al método GetHashCode. No deben usarse códigos hash para comprobar la igualdad de objetos porque dos objetos pueden tener el mismo código hash incluso si sus respectivos campos tienen valores diferentes. Estas colisiones de código hash, aunque sean poco frecuentes en la práctica, se producen. El efecto que tiene en una búsqueda de Hashtable es que dos claves que no son iguales parecen iguales, y se devuelve el objeto incorrecto de la Hashtable. Por motivos de rendimiento, la implementación de GetHashCode puede cambiar entre las versiones del tiempo de ejecución, por lo que es posible que en una versión se produzcan conflictos que no aparezcan en versiones posteriores. Habilite este MDA para probar si el código tiene errores cuando se producen colisiones de códigos hash. Cuando está habilitado, este MDA hace que el método GetHashCode devuelva un valor 0, lo que provoca que todos los códigos hash colisionen. El único efecto que debería tener la habilitación de este MDA en el programa es que se ejecute más lentamente.

El orden de enumeración de una Hashtable puede cambiar de una versión del tiempo de ejecución a otra si cambia el algoritmo que se usa para calcular los códigos hash para la clave. Para comprobar si el programa ha tomado una dependencia en el orden de enumeración de claves o valores fuera de una tabla hash, puede habilitar este MDA.

Solución

Nunca use códigos hash como sustitutos de la identidad de objetos. Implemente la invalidación del método Object.Equals para no comparar códigos hash.

No cree dependencias en el orden de las enumeraciones de claves o valores en tablas hash.

Efecto en el Runtime

Las aplicaciones se ejecutan más despacio cuando se habilita este MDA. Este MDA simplemente toma el código hash que se habría devuelto y, en su lugar, devuelve el resto cuando se divide por un módulo.

Output

No hay ningún resultado para este MDA.

Configuración

El atributo modulus especifica el módulo que se usa en el código hash. El valor predeterminado es 1.

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

Consulte también