C#:重写GetHashCode,这段代码有什么作用?

标签 c# nhibernate gethashcode

这是我在 Nhibernate 3 初学者指南 中找到的代码,用于覆盖 GetHashCode。我不明白为什么它使用结果 * 397。如果 397 只是一个随机数,他用来生成唯一的结果??

我们能否只为名字、中间名和姓氏GetHashCode,然后使用 ^ 将它们组合在一起,它也应该生成一个唯一的结果。

public override int GetHashCode()
{
   unchecked
   {
       var result = FirstName.GetHashCode();
       result = (result*397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0);
       result = (result*397) ^ LastName.GetHashCode();
       return result;
   }
}

最佳答案

将中间散列码乘以给定数字作为每个组合的一部分将意味着组合 has 代码的顺序将不是无关紧要的。

如果您只是对三个名称部分进行排他或运算,那么“John William James”将给出与“James William John”相同的哈希码。

选择

397 是因为它是一个大到足以导致哈希码溢出的质数,这有助于生成良好的哈希码分布。

溢出是此代码必须位于 unchecked block 内的原因。

关于C#:重写GetHashCode,这段代码有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620405/

相关文章:

c# - 我怎样才能像在任务管理器中一样获取我的进程的 RAM 使用情况?

c# - 如何更新 SQL 插件以在 SSMS 2016 中工作?

nhibernate - 为什么 NHibernate 需要不可设置的成员是虚拟的?

c# - NHibernate 和继承创建意外的双重查询行为?

NHibernate、非复合 ID 和 GetHashCode

c# - 是什么导致 GetHashCode 的这个实现比 .net 的实现慢 20 倍?

c# - 两个相等的 IPv6 IPAddress 实例返回不同的 GetHashCode 结果

c# - 尽管 UI 存在于 STAThread 中,为什么 Control.(Begin)Invoke 是必要的?

c# - 抛出格式异常 C#

c# - Entity Framework - 多项目支持