C# .GetHashCode是否保证跨系统/平台版本相同?

C# .GetHashCode是否保证跨系统/平台版本相同?,c#,hash,compatibility,gethashcode,C#,Hash,Compatibility,Gethashcode,可能重复: 如果在两个系统/框架版本中使用Object.GetHashCode()方法,是否保证为相同的输入获得相同的值?换句话说,它的值是否是持久数据的好键 注意:我不关心这个问题中的碰撞 作为奖励,我是否保证在Mono和Microsoft.Net中获得相同的价值?否。其他问题:-) 使用的算法未发布,也未在Ecma标准中 我将引用MSDN(我认为这个例子已经足够好了) GetHashCode的行为取决于它的实现,它可能会从公共语言运行库的一个版本更改为另一个版本。发生这种情况的原因之一是为

可能重复:

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

注意:我不关心这个问题中的碰撞

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

否。其他问题:-)

使用的算法未发布,也未在Ecma标准中

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

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

否。其他问题?:-)

使用的算法未发布,也未在Ecma标准中

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

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

答案是否定的

规则:GetHashCode的使用者不能依赖它随时间或跨appdomains保持稳定

假设您有一个Customer对象,它有一系列字段,如Name、Address等。如果在两个不同的进程中创建两个具有完全相同数据的对象,则它们不必返回相同的哈希代码。如果您在星期二在一个进程中创建这样一个对象,然后关闭它,并在星期三再次运行该程序,则哈希代码可能不同。/blockquote>

阅读

的整篇文章,答案是否定的

规则:GetHashCode的使用者不能依赖它随时间或跨appdomains保持稳定

假设您有一个Customer对象,它有一系列字段,如Name、Address等。如果在两个不同的进程中创建两个具有完全相同数据的对象,则它们不必返回相同的哈希代码。如果您在星期二在一个进程中创建这样一个对象,然后关闭它,并在星期三再次运行该程序,则哈希代码可能不同。/blockquote>


阅读

中的整篇文章,如果重写
GetHashCode()
并提供自己的实现,则可以返回相同的内容。虽然我不确定您为什么要使用该返回作为持久性存储的密钥,但当对象第一次插入存储库时,给它们自己的预定(计算)密钥也同样容易。恕我直言,但使用返回的哈希代码作为密钥似乎太聪明了。

如果覆盖
GetHashCode()
并提供自己的实现,则可以使return返回相同的内容。虽然我不确定您为什么要使用该返回作为持久性存储的密钥,但当对象第一次插入存储库时,给它们自己的预定(计算)密钥也同样容易。恕我直言,但使用返回的哈希代码作为密钥似乎太聪明了。

从技术上讲,这取决于类如何重写
GetHashCode
。如果您有:

class MyClass
{
    public override int GetHashCode() { return 42; }
}
那么这在Mono和.NET中是一致的


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

从技术上讲,这取决于类重写
GetHashCode
的方式。如果您有:

class MyClass
{
    public override int GetHashCode() { return 42; }
}
那么这在Mono和.NET中是一致的


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

据我所知,你甚至不能保证在同一台机器上的两次运行中获得相同的值。duplicate string.GetHashCode()的实现已经改变,如果你想要一个特定的计数器示例据我所知,你甚至不能保证在同一台机器上两次运行时得到相同的值。如果你想要一个特定的计数器,string.GetHashCode()的实现已经改变了。例如,生命、宇宙和一切的终极问题的答案是什么?(新MyClass()).GetHashCode()确实如此。生命、宇宙和一切的终极问题的答案是什么?(新的MyClass()).GetHashCode()确实如此。