使用异或的 GetHashCode() 问题

2023-12-29

我的理解是,您通常应该将 xor 与 GetHashCode() 一起使用来生成 int,以通过其值(而不是通过其引用)来识别数据。这是一个简单的例子:

class Foo
{
    int m_a;
    int m_b;

    public int A
    {
        get { return m_a; }
        set { m_a = value; }
    }

    public int B
    {
        get { return m_b; }
        set { m_b = value; }
    }

    public Foo(int a, int b)
    {
        m_a = a;
        m_b = b;
    }

    public override int GetHashCode()
    {
        return A ^ B;
    }

    public override bool Equals(object obj)
    {
        return this.GetHashCode() == obj.GetHashCode();
    }
}

我的想法是,我想根据属性 A 和 B 的值将 Foo 的一个实例与另一个实例进行比较。如果 Foo1.A == Foo2.A 且 Foo1.B == Foo2.B,那么我们就相等。

问题是这样的:

Foo one = new Foo(1, 2);
Foo two = new Foo(2, 1);

if (one.Equals(two)) { ... }  // This is true!

它们都为 GetHashCode() 生成值 3,导致 Equals() 返回 true。显然,这是一个简单的示例,只有两个属性,我可以简单地比较 Equals() 方法中的各个属性。然而,对于更复杂的类,这很快就会失控。

我知道有时只设置一次哈希码并始终返回相同的值是很有意义的。然而,对于需要评估相等性的可变对象,我认为这是不合理的。

在实现 GetHashCode() 时,处理可以轻松互换的属性值的最佳方法是什么?

See Also

重写 System.Object.GetHashCode 的最佳算法是什么? https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode


首先 - 不要仅根据 GetHashCode() 实现 Equals() - 即使对象不相等,哈希码有时也会发生冲突。

GetHashCode() 的合约包括以下内容:

  • 不同的hashcode意味着对象肯定不相等
  • 相同的哈希码意味着对象might相等(但也可能不相等)

安德鲁·黑尔建议我合并他的答案:

我建议你阅读这个解决方案 https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode(由我们自己的乔恩·斯基特 https://stackoverflow.com/users/22656/jon-skeet顺便说一下)计算哈希码的“更好”方法。

不,上面的速度相对较慢并且 没有多大帮助。有些人使用 XOR(例如 a ^ b ^ c),但我更喜欢 乔什·布洛赫(Josh Bloch)的方法中显示的一种方法 “有效的Java”:

public override int GetHashCode()
{
    int hash = 23;
    hash = hash*37 + craneCounterweightID;
    hash = hash*37 + trailerID;
    hash = hash*37 + craneConfigurationTypeCode.GetHashCode();
    return hash;
}

23和37是任意数字 它们是互质的。

上述相对于 XOR 的好处 方法是如果你有一个类型 它有两个值,分别是 经常相同,对这些进行异或 值总是给出相同的 结果 (0) 而上面的结果 区分它们,除非 你真不幸。

正如上面的代码片段中提到的,您可能还想看看Joshua Bloch 的书《Effective Java》 https://rads.stackoverflow.com/amzn/click/com/0321356683其中包含对该主题的很好的处理(哈希码讨论也适用于 .NET)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用异或的 GetHashCode() 问题 的相关文章

  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • while循环中的变量初始化

    我有一个可以分块读取文件的函数 public static DataObject ReadNextFile 数据对象看起来像这样 public DataObject public string Category get set And ot
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 为什么不能调用带有 auto& 参数的 const mutable lambda?

    include
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 在 Windows CE 6.0 与 Windows Mobile 6.1 下进行开发的权衡是什么

    我有一个 Windows NET 应用程序 我计划将其 移植 并定制为移动设备 该应用程序由一个独立的 NET 程序组成 该程序与条形码扫描仪配合使用 具有简单的 UI 并将扫描结果记录到文件中 还有一个 Windows 服务 可以使用 W
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • MySQL InnoDB 文本搜索选项

    完全了解我的 InnoDB 表不支持全文搜索 我想知道在表中搜索文本的替代方案是什么 是性能that使用 LIKE 时不好 我看到很多建议说在 MYISAM 表中制作相关 InnoDB 表的副本 然后对该表运行查询并匹配两者之间的键 我只是
  • 将验证码集成到 Symfony2 FOSUserBundle 注册中的最简单方法?

    我使用 Symfony2 和 FOSUserBundle 来管理注册和登录 我想添加一个验证码系统 是否有关于此的预先存在的捆绑包或教程 当然 我可以尝试使用 Google re captcha 来推出自己的验证码 在这种情况下 Googl
  • UIPickerView 行颜色

    有谁知道如何从 iPhone SDK 更改 UIPickerView 控件中行 或行背景 的颜色 类似于下面的行标题 但是我也想更改行的颜色 NSString pickerView UIPickerView pickerView title
  • 使用 Bash 变量进行大括号扩展 - {0..$foo}

    WEEKS TO SAVE 4 mkdir p weekly 0 WEEKS TO SAVE 给我一个名为 Weekly 的文件夹 0 4 创建我丢失的文件夹时大括号扩展有什么秘密吗 bash does brace expansion be
  • sphinx 构建时出现重复索引警告;如何包含文件而不对其内容建立索引?

    我希望创建一个single html rst包含我所有的文件class method attribute etc 还可以将分类符号拆分到单独的页面中 e g single html rst single html include foo r
  • EF 中索引数据注释的错误消息

    您好 我正在使用实体框架 6 1 1 它支持索引数据注释功能 我在实体类中定义了一个字段 Index scoreIndex IsUnique true public int score get set 这工作正常 但是 我试图弄清楚当分数不
  • Angular 2动态更改post请求中的基本url

    我在 Angular2 TypeScript 应用程序中有角度服务 但不知道 http 服务位置 显然需要什么 出于测试目的 我需要使用多个目标运行 TypeScript 应用程序 它可以是本地主机 用于测试 或云环境 目标是通过源代码中的
  • Dart 开发和生产的最佳实践

    抱歉 如果这是一个 noop 问题 但我对 Dart 还很陌生 我想知道是否有人有关于在 Node js 环境中开发和调试 Dart 应用程序的最佳实践的良好链接或想法 我可以启动一个独立的 Dart 应用程序并使用绝对 url 调用其余
  • Python,无法使用 graphviz 和 anytree 包来绘制树图

    所以我已经安装了anytree包 经过巨大的努力 我必须在我的系统上添加一些环境变量 完成此操作后 我可以使用 anytree 包的几乎所有功能 只是不是我想要的功能 我希望将 graphviz 与 anytree 包结合使用 以便使用 D
  • CMAKE_INSTALL_PREFIX 的介子等价物是什么?

    我习惯使用 CMake 构建代码 但我现在面临使用介子来构建某个存储库 和CMake and make 如果我使用类似的东西 cmake DCMAKE INSTALL PREFIX some where build dir make C b
  • 无法建立SSL连接,请参阅配置Github Self-Hosted Runner时的内部异常

    我正在研究 Github Enterprise 实例 并且当我尝试按照以下步骤向我的 GitHub 企业实例添加新的自托管运行器时 设置 操作 运行器 创建 自托管运行器我的组织的目录中 我在配置步骤中收到如下所示的错误 config sh
  • Spring-Cloud Zuul 破坏转发的多部分请求文件名中的 UTF-8 符号

    这是我第一次上SO 所以请耐心回答我的第一个问题 我认为我有某种配置问题 但经过一天的实验后我陷入困境 我们的应用程序基于 Spring Cloud Brixton 版本 我们有这样的配置 Portal 服务于基于角度的 Web UI 的
  • 在 Grails 中配置 Postgres

    我有一个迁移到 MySQL 和 PostgreSQL 的应用程序 并且在数据分配方面有不同的行为 通过分析在 Postgres 中创建的数据库 我意识到每个表中创建的 ID 编号不会因另一个表的更改而重置 例如 它被设置在寄存器3 Tabl
  • 无法安装调试器 gem - Rails - Mac OSX Mavericks

    我正在尝试在本地运行应用程序 但是当我这样做时 我会抛出此错误 Patricks MacBook Air niet pbj rails s Could not find debugger 1 6 1 in any of the source
  • pandas散点图绘制日期时间

    我有一个包含两列 datetime time 的数据框 我想将它们分散绘制 理想情况下 我还希望轴显示时间 但 df plot kind scatter x T1 y T2 转储一堆以 T1 上的 KeyError 结尾的内部绘图错误 或者
  • 如何配置express.js/jade处理html文件?

    我想配置 jade 引擎来处理视图文件夹中的 html 文件 这是我当前的服务器配置 app configure function var pub dir dirname public app set port process env PO
  • 在 virtualenv 中安装 pysvn

    我可以使用二进制包在站点范围内安装 pysvn 例如 在 Ubuntu 中 sudo apt get install python svn 或者 在 Windows 上 我可以使用 exe 安装程序进行站点范围内的安装 在 virtuale
  • 检查 Laravel 中的验证是否失败

    我想知道使用这种代码编写验证何时失败 我正在使用拉拉维尔 5 4 https laravel com docs 5 4 this gt validate request name gt required min 2 max 255 我知道我
  • 联系人选择器显示号码、联系人姓名以及可能的联系人图像?

    有没有办法显示同时包含号码和联系人姓名的联系人选择器 现在我正在调用选择器 startActivityForResult new Intent Intent ACTION PICK Contacts Phones CONTENT URI 1
  • 使用异或的 GetHashCode() 问题

    我的理解是 您通常应该将 xor 与 GetHashCode 一起使用来生成 int 以通过其值 而不是通过其引用 来识别数据 这是一个简单的例子 class Foo int m a int m b public int A get ret