.net Guid.GetHashCode()是否会使用不同的AppDomain返回不同的值?
根据MSDN: 相同字符串的String.GetHashCode()可能因以下原因而不同:.net Guid.GetHashCode()是否会使用不同的AppDomain返回不同的值?,.net,hash,.net,Hash,根据MSDN: 相同字符串的String.GetHashCode()可能因以下原因而不同: 不同版本的.NET Framework 不同的平台(如32位和64位) 甚至不同的应用程序域 Guid.GetHashCode()如何?在上述三种情况下会发生变化吗 我检查了2的Guid.GetHashCode()是否返回不同的值 使现代化 如何理解3关于String.GetHashCode()的内容?假设我运行同一个应用程序两次,肯定有两个不同的应用程序域。但正如我所尝试的,只要目标平台不变,哈希代码总
我必须确保特定客户端的哈希代码保持不变。继承自
系统的GetHashCode
方法。对象
随以下消息一起出现:
哈希代码用于在基于哈希表的集合中高效插入和查找。哈希代码不是永久值。因此:*不要序列化哈希代码值或将其存储在数据库中。
*不要使用哈希代码作为键从键控集合检索对象。
*不要跨应用程序域或进程发送哈希代码。在某些情况下,散列码可以基于每个进程或每个应用程序域进行计算。
*如果需要加密强散列,请不要使用散列代码而不是加密散列函数返回的值。对于加密哈希,请使用从System.Security.Cryptography.HashAlgorithm或System.Security.Cryptography.KeyedHashAlgorithm类派生的类。
*不要测试散列码是否相等,以确定两个对象是否相等。(不相等的对象可以有相同的哈希代码。)要测试相等性,请调用ReferenceEquals或Equals方法 (我的重点) 因此,无论它当前是否返回不同的值,您都应该假设它可以 关于你的3个具体案例,答案如下:
您可以实现,大多数使用hashcodes进行键控的.NET集合都可以提供一个实现该接口的自定义对象,因此您甚至可以为这些集合提供自己的hashcode实现。从
系统继承的GetHashCode方法。object
包含以下消息:
哈希代码用于在基于哈希表的集合中高效插入和查找。哈希代码不是永久值。因此:
*不要序列化哈希代码值或将其存储在数据库中。
*不要使用哈希代码作为键从键控集合检索对象。
*不要跨应用程序域或进程发送哈希代码。在某些情况下,散列码可以基于每个进程或每个应用程序域进行计算。
*如果需要加密强散列,请不要使用散列代码而不是加密散列函数返回的值。对于加密哈希,请使用从System.Security.Cryptography.HashAlgorithm或System.Security.Cryptography.KeyedHashAlgorithm类派生的类。
*不要测试散列码是否相等,以确定两个对象是否相等。(不相等的对象可以有相同的哈希代码。)要测试相等性,请调用ReferenceEquals或Equals方法
(我的重点)
因此,无论它当前是否返回不同的值,您都应该假设它可以
关于你的3个具体案例,答案如下:
可能
可能
可能
这就是重点
简言之,如果您的字符串、guid或其他任何东西需要一个可靠的hashcode实现,该实现可以持久化,并且不会受到所列内容(或您无法控制的其他内容)的影响,那么您需要自己实现它
您可以实现,大多数使用哈希代码进行键控的.NET集合都可以提供一个实现该接口的自定义对象,因此您甚至可以为这些接口提供自己的哈希代码实现。的文档非常简单;它没有定义如何计算哈希代码。因此,您应该假设Object.GetHashCode的所有警告都适用。的文档非常简单;它没有定义如何计算哈希代码。因此,您应该假设Object.GetHashCode的所有警告都适用。其他答案完全正确-因为它没有文档记录,所以您不应该依赖GUID的哈希代码在多个应用程序域中保持一致
这就是说,为了满足无聊的好奇心,这里使用了(from)的实现,它实际上似乎是一个只使用
public override int GetHashCode()
{
return _a ^ (((int)_b << 16) | (int)(ushort)_c) ^ (((int)_f << 24) | _k);
}