假设我在数据库之外有一个简单的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;
答案 0 :(得分:5)
哈希码的合同是“两个相等的对象必须具有相同的哈希码”。这意味着用于确定相等性的任何字段必须在构成哈希码的位中表示。由于您的平等契约仅涉及ID
,因此这是哈希码中唯一需要的东西。
答案 1 :(得分:2)
一个好的哈希函数应该(或多或少)随机分配哈希值,这样当你把哈希值放到一个二叉树中时,你得到一个好的,均匀分布的树,而不是一个只是一个链接列表在一边。
见这里: http://blogs.oracle.com/kah/entry/the_importance_of_good_hash
但是如果你从来没有这种需要(即你总是从数据库中返回记录,而不是从你自己的二叉树中查找它们),那么使用id作为哈希对我来说似乎是完全合理的。
答案 2 :(得分:1)
由于int已经有了获取哈希码的方法,我只想使用那个。
public override int GetHashCode()
{
return Id.GetHashCode();
}
答案 3 :(得分:1)
如果您的类只包含一个整数,则可以将其用作哈希码。这与仅返回整数本身的Int32.GetHashCode
方法的实现相同。