8

GetHashCode()当函数使用 code which 返回某些东西时,它有什么特殊含义contains ^ symbol吗?

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();
    }
}
4

5 回答 5

7

^是 C# XOR 运算符。没什么特别的,只是所有类属性的哈希码都是 XOR 在一起的。

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

Alex 8540
John 9435
Peter 2453

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

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

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

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

于 2012-05-22T16:08:04.913 回答
4

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

这不是在 Google 上搜索的最简单的事情之一!搜索此类内容时,我的提示是查看所有运算符的表

于 2012-05-22T16:07:54.160 回答
4

这就是bitwize XOR 运算符

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

话虽如此,在这种情况下,这种实现可能并不理想。使用 XOR(单独)的问题在于您不一定会减少发生冲突的机会。问题是这样定义的类:

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 时需要注意这一点。另外 - 当您制作这样的可变类型时,您应该非常小心,您的哈希码实现与您的相等检查等相匹配。

于 2012-05-22T16:12:33.673 回答
2

按位异或运算符的工作原理如下:

A = 10111 B = 01010

A ^ B = 11101

不同的对应位结果为1,相似的位结果为0。

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

于 2012-05-22T16:09:45.770 回答
0

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

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

于 2012-05-22T16:08:42.547 回答