GetHashCode()基于主键 - 是否安全?

时间:2009-07-01 16:39:48

标签: c# .net hash

类具有ID属性,并且此属性从SQL表的主键列获取值。

如果我写

,这是一个好习惯
public override int GetHashCode()
{
    return this.ID + GetType().GetHashCode();
}
进入我的班级? (等于已经以同样的方式覆盖了。)

2 个答案:

答案 0 :(得分:5)

为什么你特别想在哈希码中包含类型?我可以看到,如果你在同一张地图中有很多不同类型的具有相同ID的对象,那么这可能会有用,但通常我只是使用

public override int GetHashCode()
{
    return ID; // If ID is an int
    // return ID.GetHashCode(); // otherwise
}

请注意,在继承层次结构中,相等的概念变得棘手 - 更喜欢组合而不是继承的另一个原因。你真的需要担心吗?如果你能密封你的课程,它将使你更容易进行相等测试,因为你只需要写:

public override bool Equals(object obj)
{
    MyType other = obj as other;
    return other != null && other.ID == ID;
}

(您可能希望使用强类型的Equals方法并实现IEquatable。)

答案 1 :(得分:2)

为什么你不能这样做

public override int GetHashCode() {
    return this.ID.GetHashCode();
}

我不确定你做的是不是很好,因为我不熟悉如何将哈希码分配给类型实例。并且hashcode的目的是在Int32形式中具有对象的一致性表示。