オブジェクトのツリーを実装しています。このツリー内のすべてのクラスには、いくつかのプロパティと 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);
}
または、これを行うより良い方法はありますか?