Jak*_*ker 4 c# datetime gethashcode
这里的MSDN文章指出,GetHashCode()的默认实现不保证唯一的结果,不应该用作标识符.所以我的问题是DateTime.Now是否有自己的实现可以发出独特的哈希值.谢谢你的帮助
jas*_*son 22
首先,依赖于GetHashCode
for 的特定实现是错误的DateTime
.这是对你隐藏的东西.依赖隐藏的细节是一个糟糕的代码气味; 他们可以随时改变你并破坏你的代码.
其次,事实证明,DateTime
内部存储一个64位整数DateTime.Ticks
,用于测量自纪元(0001年1月1日午夜)以来100纳秒单位的数量.因此,DateTime
实例需要至少64位的信息.但是哈希码是32位整数,因此哈希码不能是唯一的(你不能将64位空间映射到没有冲突的32位空间).
要明确,您可以看到以下源代码DateTime.GetHashCode
:
public override int GetHashCode() {
long internalTicks = this.InternalTicks;
return (((int) internalTicks) ^ ((int) (internalTicks >> 0x20)));
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它会进行一些"折叠"以挤入InternalTicks
32位整数.
通常,不要依赖哈希码是唯一的.输入空间通常大于被散列的空间(所有32位整数的空间).
如果您必须使用唯一键来表示DateTime
对象,请使用DateTime.ToBinary
.这将为您提供64位整数,该整数是唯一的,可用于重构DateTime
(使用DateTime.FromBinary
).