是否有一个整数类型,如果溢出,它将作用回 −2,147,483,648

本文关键字:作用 整数 有一个 类型 如果 是否 溢出 | 更新日期: 2023-09-27 18:35:02

我正在实现一个对象树。此树中的每个类都有一些属性和一个 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);
}

或者有更好的方法可以做到这一点吗?

是否有一个整数类型,如果溢出,它将作用回 −2,147,483,648

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;
  }
}

除了 @Magnus awnser 之外,您还可以在"高级构建"下的项目属性中启用/禁用算术溢出检查>