0

I've recently inherited an application that makes very heavy use of session, including storing a lot of custom data objects in session. One of my first points of business with this application was to at least move the session data away from InProc, and off load it to either a stateserver or SQL Server.

After I made all of the appropriate data objects serializable, and changed the web.config to use a state service, everything appeared to work fine.

However, I found that this application does a lot of object comparisons using GetHashCode(). Methods that worked fine when the session was InProc no longer work because the HashCodes no longer match when they are supposed to. This appears to be the case when trying to find a specific child object from a parent when you know the child object's original hash code

If I simply change the web.config back to using inproc, it works again.

Anyone have any thoughts on where to begin with this?


EDIT:

qbeuek: thanks for the quick reply. In regards to:

The default implementation of GetHashCode in Object class return a hash value based on objects address in memory or something similar. If some other identity comparison is required, you have to override both Equals and GetHashCode.

I should have given more information on how they are using this. Basically, they have one parent data object, and there are several arrays of child objects. They happen to know the hash code for a particular object they need, so they are looping through a specific array of child objects looking for a hash code that matches. Once a match is found, they then use that object for other work.

4

3 に答える 3

2

あなたが書くとき

GetHashCode() を使用して多くのオブジェクト比較を行います

このコードには何かひどく問題があるように感じます。GetHashCode メソッドは、返されたハッシュ値が 2 つの異なるオブジェクトで一意であることを保証しません。GetHashCode に関する限り、すべてのオブジェクトに対して 0 を返すことができ、それでも正しいと見なされます。

2 つのオブジェクトが同じ (Equals メソッドが true を返す) 場合、それらはGetHashCode から同じ値を返さなければなりません。2 つのオブジェクトが同じハッシュ値を持つ場合、それら同じオブジェクト (Equals が true を返す) または異なるオブジェクト (Equals が false を返す) である可能性があります。

GetHashCode の結果には、それ以外の保証はありません。

Object クラスの GetHashCode のデフォルトの実装は、メモリ内のオブジェクト アドレスに基づいたハッシュ値などを返します。他の ID 比較が必要な場合は、Equals と GetHashCode の両方をオーバーライドする必要があります。

于 2008-09-17T19:46:06.777 に答える
1

このメソッドが呼び出されるクラスのGetHashCodeメソッドをオーバーライドし、一意のオブジェクトプロパティ(IDやすべてのオブジェクトフィールドなど)に基づいてハッシュコードを計算します。

于 2008-09-17T19:38:37.730 に答える
1

解決策 1: すべての子オブジェクトに一意の ID を作成し、ハッシュ コードの代わりにそれを使用します。

解決策 2: if (a.GetHashCode() == b.GetHashCode()) を if (a.Equals(b)) に置き換えます。

于 2008-09-17T20:32:12.187 に答える