MSDN 文章 here声明,GetHashCode() 的默认实现不保证唯一的结果,不应用作标识符。所以我的问题是 DateTime.Now 是否有自己的实现来给出唯一的哈希值。感谢帮助
最佳答案
首先,依赖 DateTime
的 GetHashCode
的特定实现是错误的。那是对你隐藏的东西。依赖隐藏的细节是一种糟糕的代码味道;他们可能随时改变你并破坏你的代码。
其次,事实证明 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)));
}
如您所见,它做了一些“折叠”以将 InternalTicks
压缩成 32 位整数。
一般来说,不要依赖哈希码的唯一性。输入空间一般大于被散列到的空间(所有32位整数的空间)。
如果您绝对必须有一个唯一的键来表示 DateTime
对象,请使用 DateTime.ToBinary
。这将为您提供一个唯一的 64 位整数,可用于重构 DateTime
(使用 DateTime.FromBinary
)。
关于c# - DateTime.Now 是否有自己的 GetHashCode 实现来提供唯一的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1989262/