inproc セッション変数と stateserver セッション変数の GetHashCode の異なる値
質問
最近、セッションに大量のカスタム データ オブジェクトを保存するなど、セッションを非常に頻繁に使用するアプリケーションを継承しました。このアプリケーションに関する私の最初のポイントの 1 つは、少なくともセッション データを InProc から移動し、ステートサーバーまたは SQL Server にオフロードすることでした。
適切なデータ オブジェクトをすべてシリアル化可能にし、状態サービスを使用するように web.config を変更した後、すべてが正常に動作しているように見えました。
ただし、このアプリケーションは GetHashCode() を使用して多くのオブジェクト比較を行っていることがわかりました。セッションが InProc だったときに正常に動作していたメソッドは、ハッシュコードが一致すべきときに一致しなくなったため、動作しなくなりました。これは、子オブジェクトの元のハッシュ コードがわかっている場合に、親から特定の子オブジェクトを検索しようとする場合に発生するようです。
web.config を inproc を使用するように変更するだけで、再び動作するようになります。
どこから始めればよいか考えている人はいますか?
編集:
クベエク:早速のお返事ありがとうございます。に関してで:
Object クラスの GetHashCode のデフォルト実装は、メモリ内のオブジェクト アドレスまたは同様のものに基づいてハッシュ値を返します。他の ID 比較が必要な場合は、Equals と GetHashCode の両方をオーバーライドする必要があります。
彼らがこれをどのように使用しているかについてもっと情報を提供するべきでした。基本的に、それらには 1 つの親データ オブジェクトがあり、子オブジェクトの配列がいくつかあります。彼らは必要な特定のオブジェクトのハッシュ コードをたまたま知っているので、子オブジェクトの特定の配列をループして、一致するハッシュ コードを探します。一致するものが見つかると、そのオブジェクトを他の作業に使用します。
解決
書くとき
GetHashCode() を使用して多くのオブジェクト比較を行います
このコードには何かひどく間違っている気がします。GetHashCode メソッドは、2 つの異なるオブジェクトを考慮して、返されたハッシュ値が何らかの形で一意であることを保証しません。GetHashCode に関する限り、すべてのオブジェクトに対して 0 を返すことができ、それでも正しいと見なされます。
2 つのオブジェクトが同じである (Equals メソッドが true を返す) 場合、それらは しなければならない GetHashCode から返される値は同じです。2 つのオブジェクトが同じハッシュ値を持つ場合、それらは できる 同じオブジェクトであるか (Equals は true を返す)、異なるオブジェクトである (Equals は false を返す)。
GetHashCode の結果については他に保証はありません。
Object クラスの GetHashCode のデフォルト実装は、メモリ内のオブジェクト アドレスまたは同様のものに基づいてハッシュ値を返します。他のアイデンティティ比較が必要な場合は、 しなければならない Equals と GetHashCode の両方をオーバーライドします。
他のヒント
このメソッドが呼び出されるクラスで GetHashCode メソッドをオーバーライドし、一意のオブジェクト プロパティ (ID やすべてのオブジェクト フィールドなど) に基づいてハッシュ コードを計算します。
解決策 1:すべての子オブジェクトに対して一意の ID を作成し、ハッシュ コードの代わりにそれを使用します。
解決策 2:if (a.GetHashCode() == b.GetHashCode()) を if (a.Equals(b)) に置き換えます。