2009-05-26 11 views
1

不変型のHashCodeについていくつか質問があります。不変型のコンストラクタでHashCodeを生成

  • コンストラクタ内の不変型のHashCodeを "事前に"生成することができますか、それとも何らかの理由がありますか?
  • GetHashCode()メソッドが呼び出されたとき、私は常にハッシュコードを生成する必要がありますか?

Here'sサンプルクラス:事前に生成しない

public class Id { 

     private readonly object _value; 

     private readonly int _hash = -1; 


     public Id(object value) { 
      _value = value; 
      _hash = (int) (7 * value.GetType().GetHashCode() + 7 + 7 * _value.GetHashCode()); 
     } 

     public object Value { 
      get { 
      return _value; 
      } 
     } 

     public override int GetHashCode() { 
      return _hash; 
     } 

     public override bool Equals(object obj) { 
      Id other = obj as Id; 

      if (other == null) { 
      return false; 
      } 

      return this.GetHashCode() == other.GetHashCode(); 
     } 
     } 
+0

ハッシュコードを計算する複雑な方法はなぜですか? –

+0

これはほんの一例です。 i-netのどこかでそのコードが見つかりました。私はそれがハッシュコードを生成する最良の方法ではないと思う。 – Jehof

答えて

8

ハッシュコードを事前に生成することができますが、その理由は何ですか?必要なときに(GetHashCode)それを生成して保存することができます。ほとんどのオブジェクトは決してハッシュを持つ必要はありませんので、単にプログラムを遅くするだけです。

GetHashCode()メソッドが呼び出されたとき、私は常にHashcodeを再度生成する必要がありますか?

不変オブジェクトのハッシュコードは常に同じである必要があります。そのため、生成するかどうかにかかわらず、パフォーマンスを向上させること以外は何も効果がありません。

注:HashCodeを比較することで、Equalsを定義しません.2つの異なるオブジェクトの可能性があります。は、同等のHashCode(ハッシュコレーション)を持っています。

+0

不等なオブジェクトの比較を迅速に行うために、 'Object.Equals'にハッシュコードも生成されるという考えはどう思いますか?私は、GetHashCodeを実行するために必要な時間の大半は、データをキャッシュにロードするのに費やされると考えていたので、オブジェクトのハッシュが等しい場合でも、計算されたハッシュを費やす時間の多くは、対キャッシュされていないオブジェクト – supercat

1

理由:それはオブジェクトの作成が遅くなります。

常に再生成する理由:ハッシュコードを保持するために必要なストレージを保存します。

プロファイリングが私にそれが高価であり、私は値に非常に頻繁にアクセスしていない限り、私はおそらくハッシュコードを事前計算し、不変オブジェクトのためにそれを保存するでしょう。

3

これは本当にユースケースによって異なります。

ハッシュをたくさん使用していますか?オブジェクトは不変であるため、結果を常に同じにするため、必要でないたびにオブジェクトを計算するため、オブジェクトを事前生成します。

ハッシュが頻繁に使用されていませんか?それで、プログラムが不必要に遅くなり、使用されない可能性の高いハッシュが計算されるため、事前に生成しないでください。

3番目の(そして、私の意見では)最良の選択肢は、GetHashCodeでハッシュを計算し、その結果をキャッシュし、ハッシュを1回だけ計算し、その後にこのキャッシュされたハッシュを返すことです。このようにして、使用されていないときにハッシュを計算するのに費やされる時間はなく、GetHashCodeが呼び出されるたびに不必要に計算されることもありません。これは、メモリがハッシュをオブジェクトに格納するために使用されることを意味します。

関連する問題