代码之家  ›  专栏  ›  技术社区  ›  Peter Booster

使用recordId作为hashcode是个坏主意吗?

  •  2
  • Peter Booster  · 技术社区  · 16 年前

    假设我在数据库中有一个简单的DTO对象,并且Id是 recordId

    public class DTO
    {
        public int Id { get; set; }
    
        public override bool Equals(object obj)
        {
            return (Id == ((DTO)obj).Id);
        }
    
        public override int GetHashCode()
        {
            return Id;
        }
    }
    

    我之所以有点怀疑,是因为我在周围的代码中看不到它,而不是像

    int hash = 7;
    hash = 89 * hash + pageId.hashCode();
    hash = 89 * hash + recordId;
    return hash;
    
    4 回复  |  直到 8 年前
        1
  •  5
  •   Jonathan Feinberg    16 年前

    哈希代码的约定是“两个相等的对象必须具有相同的哈希代码”。这意味着用于确定相等性的任何字段都必须用构成哈希代码的位表示。因为你的平等合同只提到 ID

        2
  •  2
  •   Bill the Lizard    14 年前

    一个好的散列函数应该(或多或少)随机地分配散列值,这样当你把散列值放入一个二叉树中时,你就得到了一个好的、均匀分布的树,而不是一个只在一边的链表。

    请看这里: http://blogs.oracle.com/kah/entry/the_importance_of_good_hash

    但是,如果您从未有过这种需要(即您将始终从数据库返回记录,而不是从您自己的二叉树中查找记录),那么在我看来,使用id作为散列是完全合理的。

        3
  •  1
  •   David Basarab    16 年前

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
    
        4
  •  1
  •   Guffa    16 年前

    如果类只包含整数,则可以将其用作哈希代码。这与 Int32.GetHashCode