我正在实现一个对象树。这棵树中的每个类都有一些属性和一个 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);
}
还是有更好的方法来做到这一点?