1

.NET の (ジェネリック) Dictionary クラスは、そのキーに対して GetHashCode() メソッドを使用してハッシュを生成すると仮定しました。そこから 2 つの質問があります。

  1. オブジェクトにはオーバーライド可能な GetHashCode() メソッドがあります。ユーザー定義の参照型オブジェクトの場合、このメソッドは参照データに基づいてハッシュを生成しますか? たとえば、1 つの String インスタンス変数のみを含むクラス OneString がある場合、一致する文字列を持つこのクラスの 2 つの別個のインスタンスは、常に同じハッシュ コードを生成しますか? それとも、この機能を実現するために OneString の GetHashCode() メソッドをオーバーライドする必要がありますか?

  2. おそらく、String クラスに実装されているハッシュ関数は、別の参照型 (BitmapImage など) に実装されているハッシュ関数とは異なります。公開されている最も一般的なクラスに実装されているハッシュ関数はありますか?

4

3 に答える 3

3

いいえ。

object.GetHashCode()そのオブジェクトの ID だけに基づいて値を返します。
2 つの同等のオブジェクトに対して同じ値を返すことはありません。オブジェクトのタイプや意味をまったく認識していません。

値を表すクラス ( など) は、表される値に基づいてハッシュを返すようにStringオーバーライドします。 使用されるアルゴリズムは、クラスの設計者次第です。他の方法と同じように書かれています。 ただし、true を返すたびに等しい値を返すことになっています。クラスがこれを行わない場合、それは間違っています。GetHashCode()
GetHashCode()
GetHashCode()Equals()

于 2012-05-29T23:10:04.783 に答える
3

オブジェクトにはオーバーライド可能な GetHashCode() メソッドがあります。ユーザー定義の参照型オブジェクトの場合、このメソッドは参照データに基づいてハッシュを生成しますか?

いいえ、デフォルトのGetHashCodeメソッドはクラス内のデータを使用しようとせず、参照に基づいているだけです。同一のコンテンツを持つ 2 つの別個のインスタンスは、異なるハッシュ コードを持ちます。

String インスタンス変数を 1 つだけ含むクラス OneString がある場合、一致する文字列を持つこのクラスの 2 つの別個のインスタンスは、常に同じハッシュ コードを生成しますか? それとも、この機能を実現するために OneString の GetHashCode() メソッドをオーバーライドする必要がありますか?

オーバーライドする必要があります。

おそらく、String クラスに実装されているハッシュ関数は、別の参照型 (SqlCommand など) に実装されているハッシュ関数とは異なります。公開されている最も一般的なクラスに実装されているハッシュ関数はありますか?

はい、GetHashCodefor 文字列と一般的な値の型が実装され、値から有効なハッシュ コードが生成されます。

于 2012-05-29T23:18:27.840 に答える
0

1) 同じ内容の異なる文字列インスタンスは、常に同じハッシュ コードを生成します。(参照: http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx )

2) GetHashCode() は基本 Object クラスのメソッドであり、そこからすべての型が派生します。そのため、どの型にもこのメソッドの実装が常に存在します。

于 2012-05-29T23:11:22.600 に答える