2011-02-02 7 views
1

私は、例えば、物事をチェック(30など)Func定義の数を持っている:Func.GetHashCodeをFunc定義のセットに頼っても安全ですか?

IsLayerEnabled 
IsEffectEnabled 
... 

私は辞書でこれらをハッシュします。それぞれのFuncの定義では、

IsLayerEnabled.GetHashCode() 
etc 

を使用するのが安全ですか?

それぞれのハッシュ値は同じですか?

+0

**どのように** Funcを辞書内で**使用する予定ですか?辞書の宣言と使用法はどのように見えますか? –

+0

それは良い質問です。私はこれまで考えなかった。今、私はFunc(型paramsなし)をDictionaryの値として使用することはできないだろうと思います。 –

+1

辞書の値になる場合、ハッシュコードは決して使用されません。ハッシュコードはDictionary **キー**のためにのみ使用されます。... –

答えて

1

これらは、各代理人ごとに異なるハッシュコードを(通常は)提供します。しかし、Delegate.GetHashCode(どのデリゲートのハッシュを生成するか)は、ハッシュの衝突を禁止しません。

つまり、Dictionary<T,U>はハッシュ衝突を非常にうまく処理しますが、30個の要素では実際の問題は発生しません。

+0

Reedさん、実装をチェックしたところ、使用しているようです:return base.GetType()。GetHashCode();これは、同じ型パラメータを持つ場合、同じハッシュ値を持つことを意味しませんか? Func aと同様に、Func bと同じですか? –

+0

ええ私はちょうどそれをチェックして、同じハッシュコードを持っています。 '65091555' –

+0

ありがとう、私は頼りにする変数はほとんどないと仮定しましたが、GetHashCodeはFunc defのために一意の十分なハッシュを生成できません。 –

0

GetHashCodeの方法は、ハッシュアルゴリズムやハッシュテーブルなどのデータ構造での使用に適しています。

これは確かに使用できます。私はそれについて何の問題も見ません。それはなぜそこにある。

編集

しかし、ええ、GetHashCodeメソッドのデフォルトの実装では、異なるオブジェクトの一意の戻り値を保証するものではありません。さらに、.NET FrameworkではGetHashCodeメソッドの既定の実装が保証されておらず、返される値は.NET Frameworkの異なるバージョン間で同じになります。したがって、このメソッドのデフォルトの実装は、ハッシングの目的で一意のオブジェクト識別子として使用されてはなりません。

+0

ええ、それはFuncの定義の仕組みはどうですか?どのように実装を見つけることができますか? –

関連する問題