MSDNによると、ハッシュ関数には次のプロパティが必要です。
2 つのオブジェクトを比較して等しい場合、各オブジェクトの GetHashCode メソッドは同じ値を返す必要があります。ただし、2 つのオブジェクトが等しくない場合、2 つのオブジェクトの GetHashCode メソッドは異なる値を返す必要はありません。
オブジェクトの GetHashCode メソッドは、オブジェクトの Equals メソッドの戻り値を決定するオブジェクトの状態に変更がない限り、一貫して同じハッシュ コードを返す必要があります。これはアプリケーションの現在の実行にのみ当てはまり、アプリケーションが再度実行されると別のハッシュ コードが返される可能性があることに注意してください。
最高のパフォーマンスを得るには、ハッシュ関数がすべての入力に対してランダムな分布を生成する必要があります。
私は次のシナリオで自分自身を見つけ続けています: クラスを作成し、実装IEquatable<T>
してオーバーライドしobject.Equals(object)
ました。MSDNは次のように述べています。
Equals をオーバーライドする型は、 GetHashCode もオーバーライドする必要があります。そうしないと、Hashtable が正しく機能しない可能性があります。
そして、それは通常、私にとっては少し止まります。なぜなら、どのように適切にオーバーライドするのobject.GetHashCode()
ですか? どこから始めればよいか分からず、多くの落とし穴があるようです。
ここ StackOverflow では、GetHashCode のオーバーライドに関連する質問がかなりありますが、それらのほとんどは、非常に特殊なケースや特定の問題に関するものであるようです。したがって、ここで適切なコンパイルを取得したいと思います。一般的なアドバイスとガイドラインを含む概要。何をすべきか、何をすべきでないか、よくある落とし穴、どこから始めるべきかなど。
特に C# 向けにしたいのですが、他の .NET 言語でも同じように機能すると思います (?)。
おそらく最善の方法は、トピックごとに 1 つの回答を作成し、最初に簡単で短い回答を作成し (可能であればワンライナーに近いものにする)、次にさらに情報を追加して、関連する質問、ディスカッション、ブログ投稿などで終了することだと思います。 、もしあれば。次に、「目次」だけを使用して、受け入れられた回答として (一番上に表示されるように) 1 つの投稿を作成できます。短く簡潔にするようにしてください。また、他の質問やブログ投稿へのリンクだけにしないでください。それらの本質を理解し、ソースにリンクするようにしてください (特に、ソースが消える可能性があるため)。また、非常によく似た回答をたくさん作成するのではなく、回答を編集して改善するようにしてください。
私はあまり優れたテクニカル ライターではありませんが、少なくとも回答が似ているように書式を設定したり、目次を作成したりします。また、SO で関連する質問の一部を検索して、私が扱えるもののエッセンスを引き出すかもしれません。しかし、私はこのトピックについてあまり安定していないので、ほとんどの場合、近づかないようにします :p