Différentes valeurs de GetHashCode pour les variables de session inproc et stateserver

StackOverflow https://stackoverflow.com/questions/86660

  •  01-07-2019
  •  | 
  •  

Question

J'ai récemment hérité d'une application qui utilise beaucoup la session, y compris le stockage de nombreux objets de données personnalisés dans la session. L’un de mes premiers objectifs avec cette application a été d’éloigner au moins les données de session d’InProc et de les charger sur un serveur d’état ou sur un serveur SQL.

Après avoir rendu tous les objets de données appropriés sérialisables et avoir modifié le service web.config pour utiliser un service d'état, tout semblait fonctionner correctement.

Cependant, j'ai constaté que cette application effectue beaucoup de comparaisons d'objets à l'aide de GetHashCode (). Les méthodes qui fonctionnaient bien lorsque la session était InProc ne fonctionnaient plus car les codes de hachage ne correspondaient plus lorsqu'ils étaient censés le faire. Cela semble être le cas lorsque vous essayez de rechercher un objet enfant spécifique auprès d'un parent lorsque vous connaissez le code de hachage d'origine de l'objet enfant

Si je modifie simplement de nouveau web.config pour utiliser inproc, cela fonctionne à nouveau.

Quelqu'un at-il une idée du point de départ?

EDIT:

qbeuek: merci pour la réponse rapide. En ce qui concerne:

  

L'implémentation par défaut de GetHashCode dans la classe Object renvoie une valeur de hachage basée sur l'adresse des objets en mémoire ou quelque chose de similaire. Si une autre comparaison d’identité est requise, vous devez remplacer Equals et GetHashCode.

J'aurais dû donner plus d'informations sur la manière dont ils l'utilisent. Fondamentalement, ils ont un objet de données parent et plusieurs tableaux d’objets enfants. Ils connaissent le code de hachage pour un objet particulier dont ils ont besoin. Ils parcourent donc un tableau spécifique d'objets enfants à la recherche d'un code de hachage correspondant. Une fois la correspondance trouvée, ils utilisent ensuite cet objet pour un autre travail.

Était-ce utile?

La solution

Quand vous écrivez

  

fait beaucoup de comparaisons d'objets à l'aide de GetHashCode ()

J'ai l'impression qu'il y a quelque chose qui cloche avec ce code. La méthode GetHashCode ne garantit pas que les valeurs de hachage renvoyées doivent être uniques, compte tenu de deux objets différents. En ce qui concerne GetHashCode, il peut renvoyer 0 pour tous les objets et être considéré comme correct.

Lorsque deux objets sont identiques (la méthode Equals renvoie true), ils DOIVENT renvoyer la même valeur renvoyée par GetHashCode. Lorsque deux objets ont la même valeur de hachage, ils peuvent être le même objet (Equals renvoie true) ou différents objets (Equals renvoie false).

Il n'y a aucune autre garantie sur le résultat de GetHashCode.

L'implémentation par défaut de GetHashCode dans la classe Object renvoie une valeur de hachage basée sur l'adresse des objets en mémoire ou quelque chose de similaire. Si une autre comparaison d’identité est requise, vous devez écraser Equals et GetHashCode.

Autres conseils

Remplacez la méthode GetHashCode dans les classes appelées cette méthode et calculez le code de hachage en fonction de propriétés d'objet uniques (comme l'ID ou tous les champs d'objet).

Solution 1: créez un identifiant unique pour tous les objets enfants et utilisez-le à la place du code de hachage.

Solution 2: remplacez if (a.GetHashCode () == b.GetHashCode ()) par if (a.Equals (b)).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top