4

重複としてマークしてください。ただし、これまでに見つけたほとんどの質問は、探しているものよりも具体的すぎるか、複雑です。たとえば、「良いハッシュ関数とは」では、受け入れられた答えは文字列のハッシュに向けられているようです。

私は最近 .NET でプログラミングを始めましたが、組み込みクラスには等価性のチェックやハッシュの検索などの基本的な機能が欠けているのが残念です。それには彼らの設計上の理由があると確信しています。.NET を防御する必要はありません。コレクションをディクショナリのキーとして使用する必要があるときに、重大なサイドトラックを回避する方法を知りたいだけです。たとえば、すべてが等しい値を含む 2 つの異なる List オブジェクトを辞書の同じエントリにマップしたいとします。そのままでは、そうではありません。List のデフォルトの動作では、List はそれ自体と等しくないため、同じ値を持つリストの別のインスタンスは別のキーになります。

Equals の実装は簡単です。よくわからないのはハッシュ関数です。

GetHashCode の実装で呼び出すことができるものはありますか?

ゼロから作成する必要がある場合、本当に単純だが十分に優れたハッシュ アルゴリズムは何ですか? SHA1 を使用できますが、やり過ぎだと思います。アイテムのすべてのハッシュを xor することもできますが、それには厄介な衝突特性があると思います。ハッシュの計算が非常に高速かどうかは気にしませんが、特定の分布を持つデータ セットでハッシュ テーブルが線形に遅くなることは望ましくありません。私が望むのは、暗記できるほど簡単なものです。なぜそれが機能するのかを説明 (またはリンク) できればボーナスです。

4

3 に答える 3