2016-05-18 1 views
1

私はTuple<T1,T2>のためにソースコードを見ていたし、そのGetHashCode()方法はthis internal helperを使用しています。複数のフィールドからHashCodeを生成するための共通のユーティリティを使用する必要がありますか?

Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { 
    return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2)); 
} 

internal static int CombineHashCodes(int h1, int h2) { 
    return (((h1 << 5) + h1)^h2); 
} 

オブジェクトの比較として、したがって、GetHasCode()の使用は、私はCLRかどうかを確認するために興味津々な一般的なタスクです。 NETはこれを行うヘルパー/ユーティリティを提供しているので、同じコードを何度も繰り返し書く必要はなく、エラーが発生する危険性がありますか?

+0

タプルをコピーしないでください。衝突する可能性があります。そして、あなたはどのようにエラーを導入できますか? – Paparazzi

+0

パパラッチの衝突は許可されます –

+0

@ Mr.Boyそれはあなたがそれらを望んでいるという意味ですか? – Paparazzi

答えて

4

もちろん、Tuple.Create(h1, h2).GetHashCode()を使用することもできます。 ValueTupleが次のバージョンになる可能性が非常に高い(C#7がサポートする可能性のある種類のタプルの場合)、割り当ては必要ありません。

これまでのところ、それはあなたのものとほぼ同じですが、もっと多くのものがあるべきだという提案がありました。

しかし、ひとつの質問がありますが、それは人々が価値観を考えるのを妨げるでしょうか?どのような値の範囲が見られるか、一般的に見られるでしょう。あなたが与えるコードは、必ずしも2つの整数をハッシュコードに結合する最良の方法ではありません。 2つのオブジェクトが同じであることがまれであった場合は、h1return h1が良いでしょう。 h1が常に0〜15の範囲にあり、h2がまれに数百を超えることはめったにありませんでしたが、(h1 << 4) + h2がそれより良い場合があります。 h1h2がユーザの入力に基づいて直接設定されている場合、ハッシュDoSingなどを防ぐために乱数の種に入れたいと思うでしょう。

+1

匿名型は、タプルの代替として( 'new {this.a、this.b} .GetHashCode()')もうまく機能します。しかし、両者のパフォーマンスに差があるかどうかは不明です。 – Rob

+0

私は実際に@Robが好きです。実際、それはおそらくもっと良い答えです –

関連する問題