【发布时间】:2014-10-26 05:50:57
【问题描述】:
根据 MSDN:http://msdn.microsoft.com/en-us/library/system.string.gethashcode%28v=vs.110%29.aspx,
相同字符串的String.GetHashCode() 可能因以下原因而不同:
.NET Framework 的不同版本。
不同的平台(如 32 位和 64 位)。
甚至是不同的应用领域。
Guid.GetHashCode() 怎么样?以上3种情况会发生变化吗?
我检查了 2,Guid.GetHashCode() 确实返回不同的值。
更新
关于String.GetHashCode()如何理解3?假设我两次运行同一个应用程序,肯定有 2 个不同的应用程序域。但正如我所尝试的,只要目标平台不改变,哈希码总是相同的。例如,“你好,世界”.GetHashCode()。
那么 3 什么时候会发生?
这是我的一些问题背景:
我的服务器应用程序从客户端接收一些 GUID。 GUID 对于每个客户端都是唯一的。我想将客户端分配到不同的存储桶。而且我需要保持客户端-存储桶映射固定。有很多客户,所以我无法将所有看到的客户都保存在内存中。
我目前的解决方案是:
- 获取客户端 GUID 的哈希码(GUID 或 GUID 字符串,尚未确定)。
- 使用(HashCode % 桶总数)作为桶索引。
我必须确保特定客户端的哈希码保持不变。
【问题讨论】:
-
为什么你需要知道这个?为什么在 32 位和 64 位上执行的相同代码给出不同的哈希码会很重要?
-
不,它没有。你的 2. 测试不太可能是正确的,第二次运行它时你会得到一个不同的 guid :) 它的实现is very simple。 String.GetHashCode() 得到了很多额外的关注,因为它经常被使用并且具有安全隐患。 Details here.
-
如果您需要一种不受您无法控制的更改影响的可靠哈希码实现,您应该自己实现一个。
GetHashCode被明确记录为不被持久化,因此您不能相信计算会保持不变。一个微不足道的 .NET 修补程序可能会在您的应用程序下更改它。