2011-10-22 60 views
0

可能重复:
Can I depend on the values of GetHashCode() to be consistent?.GetHashCode保证在系统/平台版本中保持一致?

如果我使用Object.GetHashCode()方法在两个系统间/ framework版本的,我保证可以得到相同的输入相同的值?换句话说,它的价值是否成为持久数据的关键?

注:我不在乎这个问题的冲突。

作为奖励,我保证在Mono和Microsoft.Net中获得相同的价值吗?

+0

据我所知,在两台完全相同的机器上,你甚至不能保证获得相同的值。 – delnan

+2

Dublicate http://stackoverflow.com/questions/53086/can-i-depend-on-the-values-of-gethashcode-to-be-consistent –

+1

如果你想要一个string.GetHashCode()的实现已经改变具体的反例 –

回答

3

其他问题? :-)

使用的算法没有公布,也没有在Ecma标准中。

我会从MSDN String.GetHashCode引用(我认为这个例子是不够好)

的GetHashCode的行为取决于它的实现,这可能会从公共语言运行库的一个版本改变另一个。这可能发生的原因是为了提高GetHashCode的性能。

0

答案是否定的

规则:GetHashCode的消费者不能依靠它暂时稳定一段时间或跨应用程序域

假设你有一个有一堆像领域的客户对象名称,地址等。如果在两个不同的进程中使两个这样的对象具有完全相同的数据,则它们不必返回相同的哈希码。如果你在21日这样的目的是在一个过程中,将其关闭,并在周三再次运行该程序中,哈希代码可以是different./blockquote>

阅读全文从Guidelines and rules for GetHashCode

0

你可以做如果您覆盖GetHashCode()并提供您自己的实现,则返回相同的结果。虽然我不确定为什么要使用返回值作为持久存储的关键,但在将对象首次插入到存储库中时,为对象提供它们自己的预定(计算)的键也同样简单。所有应有的尊重,但使用返回的哈希代码作为关键只是似乎你试图为自己的善良太聪明。

1

从技术上讲,这取决于您的类如何覆盖GetHashCode。如果你有这个:

class MyClass 
{ 
    public override int GetHashCode() { return 42; } 
} 

那么这将是一致的单声道和.NET。 :)

当然,如果您的GetHashCode实现取决于不能保证跨平台一致性的类型(例如string),那么MyClass.GetHashCode()也将不一致。

+0

生命,宇宙和万物终极问题的答案是什么? (new MyClass())。GetHashCode()的确如此。 –