当GetHashCode()
函数使用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();
}
}
答案 0 :(得分:5)
^
是C#XOR operator。没有什么“特别”的,只是所有类属性的哈希码都是异或的。
编辑:GetHashCode
返回一个通用代码,用作复杂对象的速记标识符。当您想要存储对象然后根据其哈希代码快速检索它们时,常见的用途是散列数据结构。假设一个类Person
和一些带有相应哈希码的对象:
Alex 8540
John 9435
Peter 2453
这些代码是根据每个对象的部分或全部字段生成的,必须尽可能少地发生冲突,以确保有效散列。现在我们可以使用哈希码将对象存储在哈希表中:
Entries
0 -> Alex
1 -> John
2 -> Peter
使用各自的哈希码将对象存储在表内以确定位置。接下来,可以使用相同的哈希码轻松检索它们。
我建议你找一些关于哈希表如何工作的文献,因为在SO帖子中解释太多了。
答案 1 :(得分:4)
那只是bitwise xor operator。它通常用于将来自不同对象的哈希码组合成单个整体哈希码。
这不是Google最容易搜索的内容之一!我在搜索此类内容时的提示是查看table of all operators。
答案 2 :(得分:2)
这是在实施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时需要注意一些事项。此外 - 当您创建这样的可变类型时,您应该非常小心,以便您的哈希代码实现与您的等式检查匹配等。
答案 3 :(得分:0)
^
如果C#中的XOR运算符在此处显示:http://msdn.microsoft.com/en-us/library/zkacc7k1.aspx
您所做的所有示例都是对其属性中的哈希码进行异或。
答案 4 :(得分:0)
按位XOR运算符的工作方式如下:
A = 10111 B = 01010
A ^ B = 11101
不同的对应位在1中重新组合,类似的导致0。
在你的情况下,这些整数首先被转换为二进制,然后按照上面的例子进行处理。