2011-07-26 7 views
9

私はフィールドがbool[](実行時に決定される)である不変クラスを持っています。ブール値のみからのGetHashCode()

このクラスの適切なハッシュコードはどのように計算できますか?通常、私は各フィールドでGetHashCode()と呼んで、これらの演算子の1つである+ | &と組み合わせるだけですが、の0true1の唯一の可能なハッシュコードは、実際にはどこにも届きません。私の実装はboolsでのみ動作する必要があり、任意のサイズの配列で動作する必要があります。

(。。おそらくあまり問題ありませんが、私はC#の/でコーディングしていNET)を

+0

あなたは 'BitArray'または' BitVector32'のサイズに頼っていますか?これは 'GetHashCode'などの実装が少なくて済みます。 – Sebastian

答えて

8

あなたbool[]bools命名されたと仮定すると:あなたが懸念しているまで

unchecked { 
    int hash = 17; 
    for(int index = 0; index < bools.Length; index++) { 
     hash = hash * 23 + bools[index].GetHashCode(); 
    } 
    return hash; 
} 
+1

番号を説明してもらえますか? 17と23はどこから来たのですか? :-) –

+0

@Jamie Dixon:これは標準的な実装です。要点は乗数が素数であることです。私はJavaの 'String.getHashCode'は非常に似たものだと思います。 – jason

+0

これはうまくいきません。異なる位置にある同じ要素を持つ配列は、同じハッシュコードを返します。 – mcabral

0

シンプルbools.GetHashCode()が正常に動作しますパフォーマンスについて(この場合はJasonのソリューションを使用します)。