2013-02-03 46 views
0

知道这不是很聪明地使用HashCode作为一个唯一的标识符,GetHashCode的冲突

但假设我有相同的hashCode两个变量是我可以让他们的唯一途径,

我怎么能说出不同?

+0

你可以发布代码吗?我不太确定“在同一个HashCode上是什么意思是我能得到它们的唯一方式”。 –

+0

我没有代码,它是一个普遍的问题。 –

回答

1

你应该能够确定引用是等价的。

尝试使用ReferenceEquals函数检查是否有对同一对象的引用。

+0

但是'Equals'用于测试这两个对象是否“喜欢”。即使有两个对象,情况也是如此。例如'string x =“abc”;字符串y =“a”; y + =“bc”;',代码运行后,'x'和'y'具有相同的散列码。 'Equals'返回'true',因为'x'和'y'具有相同的字符串值。但'ReferenceEquals'返回'false',因为'x'和'y'指的是两个对象,不是同一个(不重要的是两个对象实际上是相同的)。 –

+0

@JeppeStigNielsen你是对的。但是,我相信提问者试图确定他是否提及同一个对象,而不是如果变量的值相等。 – Mash

+1

如果她(@HodayaShalom)真的只对对象平等感兴趣,而不是使用'x.GetHashCode()',她可以说'RuntimeHelpers.GetHashCode(x)'。即使“x”和“y”是两个“等于”wrt的对象实例,它将(以极高的概率)给出唯一的代码。 'Equals'。另一方面,重写的实例方法'GetHashCode()'(无参数)必须为'x'和'y'提供一个共同的哈希。 –

1

这在文档中有很多介绍。假设你只有散列码:

GetHashCode方法的默认实现不是 保证了不同对象的唯一返回值。此外,.NET Framework不保证 GetHashCode方法的默认实现,并且它返回的值将在 不同版本的.NET Framework之间相同。因此,不得将此方法的默认实现用作散列目的的唯一对象 标识符。

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

+0

我读过它,但让我们说这样的事情发生了,我无法改变它,没有办法知道两个变量之间的差异? –

+1

假设你有旧的哈希码,不。你可以检查对象引用是否相等,但你的问题似乎暗示你所知道的是散列码。 –