使用recordId作为哈希码是不是一个坏主意?

时间:2010-01-20 17:02:28

标签: .net hash

假设我在数据库之外有一个简单的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 个答案:

答案 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方法的实现相同。