DateTime.Now是否有自己的GetHashCode实现,它提供了唯一的哈希值?

Jak*_*ker 4 c# datetime gethashcode

这里的MSDN文章指出,GetHashCode()的默认实现不保证唯一的结果,不应该用作标识符.所以我的问题是DateTime.Now是否有自己的实现可以发出独特的哈希值.谢谢你的帮助

jas*_*son 22

首先,依赖于GetHashCodefor 的特定实现是错误的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)

正如您所看到的,它会进行一些"折叠"以挤入InternalTicks32位整数.

通常,不要依赖哈希码是唯一的.输入空间通常大于被散列的空间(所有32位整数的空间).

如果您必须使用唯一键来表示DateTime对象,请使用DateTime.ToBinary.这将为您提供64位整数,该整数是唯一的,可用于重构DateTime(使用DateTime.FromBinary).