Compartir a través de


MDA de moduloObjectHashcode

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

Síntomas

Después de actualizar a una nueva versión de Common Language Runtime (CLR), un programa deja de ejecutarse correctamente:

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

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

  • Dos objetos que eran iguales ya no son iguales.

  • Dos objetos que no eran iguales ahora son iguales.

Motivo

Su programa puede estar recibiendo un objeto equivocado desde una Hashtable porque la implementación del método Equals en la clase para que la clave pasada a Hashtable compruebe si son iguales los objetos comparando los resultados de la llamada al método GetHashCode. Los códigos hash no deberían utilizarse para comprobar si los objetos son iguales porque dos objetos pueden tener el mismo código hash incluso si sus respectivos campos tienen valores distintos. Estas colisiones de código hash, aunque sean raras en la práctica, se producen. El efecto que este fenómeno ejerce en una consulta de Hashtable es que dos claves que no son iguales parecen serlo y se devuelve el objeto incorrecto desde la Hashtable. Por motivos de rendimiento, la implementación de GetHashCode puede cambiar entre las versiones en tiempo de ejecución, por lo que las colisiones que podrían no producirse en una versión sí es posible que se produzcan en versiones posteriores. Habilite este MDA para probar si en su código aparecen errores cuando se producen colisiones de códigos hash. Cuando está habilitado, este MDA hace que el método GetHashCode devuelva 0, lo que hace que todos los códigos hash entren en colisión. El único efecto que debería tener la habilitación de este MDA en su programa es que éste se ejecuta más lentamente.

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

Resolución

Nunca utilice los códigos hash como suplente para la identidad de los objetos. Implemente el reemplazo del Object.Equals para que no se comparen los códigos hash.

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

Efecto en el tiempo de ejecución

Las aplicaciones se ejecutan más despacio cuando este MDA está habilitado. 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

Este MDA no produce ningún resultado.

Configuración

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

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

Vea también

Referencia

Object.GetHashCode

Object.Equals

Conceptos

Diagnóstico de errores con ayudantes de depuraciones administradas