1

オブジェクトのツリーを実装しています。このツリー内のすべてのクラスには、いくつかのプロパティと GetHashCode() メソッドがあります。私が計画しているのは、すべてのプロパティのハッシュを結合し、そのハッシュを子ノードのハッシュと結合することです。現時点では Visual Studio を使用していませんが、コードは次のようになります。

class Node
{
  public int Prop1 {get; set;}
  public string Prop2 {get; set;}
  public IEnumerable<Node> Children {get; set; }
  private int _hash;
  public override int GetHashCode()
  {   
      if (_hash == 0)
      {
        _hash = 17;
        _hash = _hash * 31 + Prop1.GetHashCode();
        _hash = _hash * 31 + Prop2.GetHashCode();
        foreach(var child in Children)
        {
            _hash = _hash * 31 + child.GetHasCode();
        }
      }
      return _hash;
  }
}

これは機能するはずですが、int 32 型をオーバーフローするほど大きな値になってしまうことを懸念しています。これを防ぐ別のタイプはありますが、intとして返すことはできますか? モジュラスと uint を使用することを考えましたが、これを有効な int に戻すにはどうすればよいですか? 私はちょうどこのようなことをすることができます:

unit _hash = 0;
public override int GetHashCode()
{
   // See code above
   return (int)((_hash % 4294967295) - int.MaxValue);
}

または、これを行うより良い方法はありますか?

4

2 に答える 2

6

コードを次のように囲んuncheckedで、整数型の算術演算と変換のオーバーフロー チェックを抑制します。

public override int GetHashCode()
{  
  unchecked
  { 
      if (_hash == 0)
      {
        _hash = 17;
        _hash = _hash * 31 + Prop1.GetHashCode();
        _hash = _hash * 31 + Prop2.GetHashCode();
        foreach(var child in Children)
        {
            _hash = _hash * 31 + child.GetHasCode();
        }
      }
      return _hash;
  }
}
于 2013-10-10T18:19:13.870 に答える
0

@Magnus awnser に加えて、Build > Advanced の下のプロジェクト プロパティで算術オーバーフロー チェックを有効/無効にすることもできます。

于 2013-10-10T18:20:11.693 に答える