c# - DateTime.Now 是否有自己的 GetHashCode 实现来提供唯一的哈希值?

标签 c# datetime gethashcode

MSDN 文章 here声明,GetHashCode() 的默认实现不保证唯一的结果,不应用作标识符。所以我的问题是 DateTime.Now 是否有自己的实现来给出唯一的哈希值。感谢帮助

最佳答案

首先,依赖 DateTimeGetHashCode 的特定实现是错误的。那是对你隐藏的东西。依赖隐藏的细节是一种糟糕的代码味道;他们可能随时改变你并破坏你的代码。

其次,事实证明 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/

相关文章:

c# - 泛型:如何检查 T 的确切类型,没有 T 的对象

php - 在两个日期之间在 MySQL 或 PHP 中生成 50 个随机持续时间间隔

MySQL 在工作日+时间戳的小时连接表,每个表的计数

c# - 通用 IEqualityComparer<T> 和 GetHashCode

c# - 在运行时复制控制按钮

c# - AES 64 key 生成

c# - MultipartFormDataStreamProvider 和上传后立即读取文件有时会失败

perl - 给定一个 Perl DateTime 对象,我如何输出 "1st, 2nd, 3rd, 4th of the month"

c# - 如何在 .net (c#) 中为可安全存储在数据库中的字符串创建 HashCode?

C#:如何对 GetHashCode 进行单元测试?