.GetHashCode是否保证在系统/平台版本中是相同的?

时间:2011-10-22 12:01:23

标签: c# hash compatibility gethashcode

  

可能重复:
  Can I depend on the values of GetHashCode() to be consistent?

如果我在两个系统/框架版本中使用Object.GetHashCode()方法,我保证为同一输入获得相同的值吗?换句话说,它的价值是否是持久数据的良好关键?

注意:我不关心此问题中的碰撞。

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

4 个答案:

答案 0 :(得分:4)

没有。其他问题? : - )

使用的算法未发布,也不属于Ecma标准。

我将引用MSDN String.GetHashCode(我认为这个例子已经足够了)

  

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

答案 1 :(得分:1)

答案是否

规则:GetHashCode的消费者不能依赖它随时间推移或跨appdomains稳定

假设您有一个Customer对象,其中包含一系列字段,如Name,Address等。如果在两个不同的进程中使用完全相同的数据生成两个这样的对象,则它们不必返回相同的哈希代码。如果你在星期二的一个进程中创建了这样一个对象,关闭它,并在星期三再次运行程序,哈希码可以是不同的./blockquote>

阅读Guidelines and rules for GetHashCode

的完整文章

答案 2 :(得分:1)

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

class MyClass
{
    public override int GetHashCode() { return 42; }
}
然后,这将在Mono和.NET中保持一致。 :)

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

答案 3 :(得分:0)

如果覆盖GetHashCode()并提供自己的实现,则可以返回相同的内容。虽然我不确定为什么你想要使用它的返回作为持久存储的关键,但是当它们首次插入存储库时,给对象提供他们自己的预定(计算)密钥同样容易。所有应有的尊重,但使用返回的哈希码作为关键看起来好像你想要为自己的利益而过于聪明。