首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现GetHashCode

实现GetHashCode
EN

Stack Overflow用户
提问于 2010-05-22 22:46:25
回答 1查看 12.8K关注 0票数 10

可能重复:

What is the best algorithm for an overridden System.Object.GetHashCode?

什么构成了GetHashCode方法的良好实现?我做了一些googling,并找到了一些好行(MSDN),但是逻辑似乎只是操纵类中两个作为字段存储的数字。实现此方法的实际逻辑是否如此简单?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-22 23:10:27

最低要求是,对于任何给定的值,哈希代码应该是相同的。因此,这个实现可以工作,但是发行版很糟糕:

代码语言:javascript
复制
public override int GetHashCode() {
  return 1;
}

为了更好地工作,散列码应该考虑对象中的所有相关数据,并尽可能均匀地分布在整数范围内。

在System.Drawing.Point结构中可以找到一个考虑到所有成员但没有给出很好分布的实现。它使用XOR组合成员中的位,这意味着X和Y相等的所有点都得到散列码为零:

代码语言:javascript
复制
public override int GetHashCode() {
  return this.X ^ this.Y;
}

获得更好分布的一种方法是将一个成员乘以一个素数并添加下一个成员,根据需要重复如下:

代码语言:javascript
复制
public override int GetHashCode() {
  return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3;
}

同样的方法也被用于简单的随机生成器中,因为它很好地分散了值。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2890040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档