GetHashCode() with ^

本文关键字:with GetHashCode | 更新日期: 2023-09-27 18:35:03

当函数使用contains ^ symbol的代码返回某些内容时GetHashCode()它是否有一些特殊含义?

public class ClassProp
{
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }
    public int Prop3 { get; set; }
    public int Prop4 { get; set; }
    public int Prop5 { get; set; }
    public override int GetHashCode()
    {
        return Prop1.GetHashCode() ^ Prop2.GetHashCode() ^ 
               Prop3.GetHashCode() ^ Prop4.GetHashCode() ^ Prop5.GetHashCode();
    }
}

GetHashCode() with ^

^是 C# XOR 运算符。它没有什么"特别的",只是所有类属性的哈希代码都是异或的。

编辑GetHashCode返回用作复杂对象的速记标识符的泛型代码。常见的用途是当您想要存储对象,然后根据其哈希代码快速检索它们时,对数据结构进行哈希处理。假设一个类Person和一些具有相应哈希码的对象:

Alex 8540
John 9435
Peter 2453

这些代码是基于每个对象的部分或全部字段生成的,并且必须尽可能少地发生冲突以确保有效的哈希。现在我们可以使用哈希代码将对象存储在哈希表中:

Entries
0 -> Alex
1 -> John
2 -> Peter

对象使用各自的哈希码存储在表中以确定位置。接下来,可以使用相同的哈希代码轻松检索它们。

我建议你找到一些关于哈希表如何工作的文献,因为在SO帖子中解释它有点太多了。

这只是按位异或运算符。它通常用于将来自不同对象的哈希代码组合成单个整体哈希代码。

这不是在谷歌上搜索最容易的事情之一!搜索这些东西时,我的提示是查看所有运算符的表。

这就是 bitwize XOR 运算符。

这是实现GetHashCode时使用的非常常见的运算符。

话虽如此,在这种情况下,这种实现可能并不理想。 使用异或(单独(的问题在于,您不一定会减少碰撞的机会。 问题是类定义如下:

class Foo
{
    public int Bar { get; set; }
    public int Baz { get; set; }
    // ...
    public override int GetHashCode()
    {  return this.Bar.GetHashCode() ^ this.Baz.GetHashCode(); }
}
当 Bar==2 和 Baz==4 时,

将创建与 Bar==4 和 Baz==2 时相同的哈希代码。 根据用例的不同,这可能会导致更多的哈希冲突,因此在实现 GetHashCode 时需要注意这一点。 另外 - 当你制作这样的可变类型时,你应该非常小心,你的哈希代码实现与你的相等性检查匹配,等等。

按位 XOR 运算符的工作方式如下:

A = 10111B = 01010

A ^ B = 11101

不同的对应位在 1 中,相似的位导致 0。

在您的情况下,这些整数首先被转换为二进制,然后如上例所示进行处理。

^如果

C# 中的 XOR 运算符参见此处:http://msdn.microsoft.com/en-us/library/zkacc7k1.aspx

您的示例所做的只是从其属性中对哈希代码进行异或运算。