Partager via


moduloObjectHashcode (MDA)

Remarque

Cet article est spécifique au .NET Framework. Elle ne s’applique pas aux implémentations plus récentes de .NET, notamment .NET 6 et versions ultérieures.

L’Assistant Débogage managé moduloObjectHashcode modifie le comportement de la classe Object pour effectuer une opération modulo sur le code de hachage retourné par la méthode GetHashCode. Le modulo par défaut pour cet Assistant Débogage managé est 1, ce qui fait que GetHashCode retourne 0 pour tous les objets.

Symptômes

Après le passage à une nouvelle version du common language runtime, un programme ne s’exécute plus correctement :

  • Le programme reçoit un objet incorrect d’un Hashtable.

  • L’ordre d’énumération d’un Hashtable a changé et le programme ne fonctionne plus correctement.

  • Deux objets qui étaient habituellement égaux ne le sont plus.

  • Deux objets qui étaient habituellement inégaux sont maintenant égaux.

Cause

Votre programme reçoit peut-être un objet incorrect d’un Hashtable en raison du fait que l’implémentation de la méthode Equals sur la classe pour la clé dans le Hashtable teste l’égalité des objets en comparant les résultats de l’appel à la méthode GetHashCode. Les codes de hachage ne doivent pas être utilisés pour tester l’égalité entre des objets, car deux objets peuvent avoir le même code de hachage même si leurs champs respectifs ont des valeurs différentes. Ces collisions de codes de hachage, bien que rares dans la pratique, se produisent. L’effet de ceci sur une recherche dans Hashtable est que deux clés qui ne sont pas égales apparaissent comme étant égales et que l’objet incorrect est retourné depuis le Hashtable. Pour des raisons de performances, l’implémentation de GetHashCode peut changer entre les versions du runtime : ainsi, des collisions qui ne se produisent pas sur une version peuvent se produire sur les versions ultérieures. Activez cet Assistant Débogage managé pour tester si votre code comporte des bogues en cas de collision de codes de hachage. Quand il est activé, cet Assistant Débogage managé fait que la méthode GetHashCode retourne 0, ce qui entraîne une collision de tous les codes de hachage. Le seul effet que l’activation de cet Assistant Débogage managé doit avoir sur votre programme est que celui-ci s’exécute plus lentement.

L’ordre d’énumération d’un Hashtable peut changer d’une version du runtime à l’autre si l’algorithme utilisé pour calculer les codes de hachage de la clé change. Pour tester si votre programme est dépendant de l’ordre d’énumération des clés ou des valeurs provenant d’une table de hachage, vous pouvez activer cet Assistant Débogage managé.

Résolution

N’utilisez jamais de codes de hachage en remplacement de l’identité d’un objet. Implémentez le remplacement de la méthode Object.Equals de façon à ne pas comparer les codes de hachage.

Ne créez pas de dépendances par rapport à l’ordre des énumérations de clés ou de valeurs dans des tables de hachage.

Effet sur le runtime

Les applications s’exécutent plus lentement quand cet Assistant Débogage managé est activé. Cet Assistant Débogage managé prend le code de hachage qui aurait été retourné et retourne à la place le reste de la division par un modulo.

Output

Cet Assistant Débogage managé n’a pas de sortie.

Configuration

L’attribut modulus spécifie le modulo utilisé sur le code de hachage. La valeur par défaut est 1.

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

Voir aussi