4

このようなGetHashCode()の実装を見つけました

    Guid _hashCode = Guid.NewGuid();
    public override int GetHashCode()
    {
        return _hashCode.GetHashCode();
    }

Equalsは正しいように見えますが、この実装によって.NETに関する多くの仮定が破られると言うのは正しいですか?

       public override bool Equals(object obj)
    {
        if (obj.GetType() != trustedEntity.GetType())
            return false;

        TrustedEntity typedObj = (TrustedEntity)obj;

        if (trustedEntity.BackTrustLink != typedObj.BackTrustLink)
            return false;
        if (trustedEntity.ForwardTrustLink != typedObj.ForwardTrustLink)
            return false;
        if (trustedEntity.EntryName != typedObj.EntryName)
            return false;

        return true;
    }

私が聞いている反論は、オブジェクトが作成された後はGetHashCodeを変更する必要がないというものです。これは、このオブジェクトが辞書に保存されているためです。

誰かが私のためにこれを片付けて、オブジェクトが変更された場合にGetHashCodeに何が起こる必要があるかを説明できますか?それは最終的にEqualsメソッドを変更しますか?

4

2 に答える 2

2

MSDNから(実装者へのメモセクション)

ハッシュ関数には、次のプロパティが必要です。

  1. 2つのオブジェクトが等しいと比較される場合、各オブジェクトのGetHashCodeメソッドは同じ値を返す必要があります。ただし、2つのオブジェクトが同等であると比較されない場合、2つのオブジェクトのGetHashCodeメソッドは異なる値を返す必要はありません。

  2. オブジェクトのGetHashCodeメソッドは、オブジェクトのEqualsメソッドの戻り値を決定するオブジェクトの状態に変更がない限り、一貫して同じハッシュコードを返す必要があります。これはアプリケーションの現在の実行にのみ当てはまり、アプリケーションを再度実行すると別のハッシュコードが返される可能性があることに注意してください。

  3. 最高のパフォーマンスを得るには、ハッシュ関数がすべての入力に対してランダムな分布を生成する必要があります。

このオブジェクトのメソッドによってはEquals、ドキュメントの最初のポイントにも違反している可能性があります。

より優れた読書

于 2012-10-17T21:29:58.257 に答える
1

ハッシュは、入力を受け取り、再現可能な出力を提供する一方向の数学関数です。

ハッシュは、それ自体が識別できないデータを識別するためによく使用されるため、データのブロックでハッシュを計算する場合、そのデータは常に同じハッシュを作成する必要があります。一例はパスワードです。サイトに登録すると、アルゴリズムを介してパスワードのハッシュが保存されます。ログインすると、パスワードをサイトに送信します。サイトは、保存時に使用したのと同じアルゴリズムを使用してパスワードをハッシュします。2つのハッシュ値が一致する場合は、正しいパスワードを入力しています。

オブジェクトが変更された場合、計算されるハッシュは異なります。これは、データ検証にとってしばしば重要です。sha1を使用して文字列「Frank」を123456789にハッシュし(単なる例)、データをハッシュと一緒に送信すると、同じハッシュを実行して、値が一致するかどうかを確認できます。私のビットが送信中に混乱し、「Brank」を受信した場合、ハッシュを計算するとき、それは123456789ではなく、送信中にデータが破損していることがわかります。

を使用NewGuidすると、元のデータとは関係のない乱数を生成するだけです。再現できないため、上記のすべての例を実行することはできません。ハッシュアルゴリズムは、常に同じ入力に対して同じ出力を提供する必要があり、他の入力が同じ出力を生成しないようにする必要もあります。

お役に立てば幸い

于 2012-10-17T21:31:45.297 に答える