我正在使用Linq-to-Sql查询SQL Server数据库。此查询返回数据库中实体的列表。我的基础数据不会改变。GetHashCode返回不同的值
一旦我收到了List,我就调用GetHashCode来测试它是否相等。奇怪的是,哈希值总是不同的。为什么它总是会有所不同?
谢谢,
我正在使用Linq-to-Sql查询SQL Server数据库。此查询返回数据库中实体的列表。我的基础数据不会改变。GetHashCode返回不同的值
一旦我收到了List,我就调用GetHashCode来测试它是否相等。奇怪的是,哈希值总是不同的。为什么它总是会有所不同?
谢谢,
是不同的,因为它们是不同的对象引用。
如果您想以这种方式行事,您需要根据对象数据覆盖对象的Equals()和。
Here你有一个关于如何去做的例子,here关于覆盖GetHashCode()
方法的指南的博客文章。希望能帮助到你。
class TwoDPoint : System.Object
{
public readonly int x, y;
public TwoDPoint(int x, int y)
{
this.x = x;
this.y = y;
}
public override bool Equals(System.Object obj)
{
if (obj == null) return false;
TwoDPoint p = obj as TwoDPoint;
if (p == null) return false;
// Return true if the fields match
return (x == p.x) && (y == p.y);
}
public override int GetHashCode()
{
return x^y;
}
}
由于Servy在他的评论中说,记住,甚至重写GetHashCode()
方法,你将不能够有这种类型的数据(曾经)的无碰撞的哈希值,你只能减少碰撞率。您需要使用Equals()
以确保具有相同散列的对象真的相同
您覆盖了GetHashCode()
?如果不是,默认实现是根据列表的参考给你一个哈希码。它不会与列表中的内容有任何关系。
所以两个不同的实例是指两个不同的哈希码。
要检查实体类上的列表平等覆盖Equals
(和GetHashCode()
),并在列表上使用SequenceEqual
。
请记住,即使您重写'GetHashCode'以基于内容,作为答案状态,您仍然需要处理碰撞,这些对象具有不同的值但解析为相同的哈希码。您将无法与该类型的数据进行无碰撞散列(以前),您只能降低冲突率。您需要使用'Equals'来确保具有相同哈希的对象真的是相同的。 – Servy