jjzjj

gethashcode

全部标签

c# - 为什么重写 Equals 方法时重写 GetHashCode 很重要?

给定以下类(class)publicclassFoo{publicintFooId{get;set;}publicstringFooName{get;set;}publicoverrideboolEquals(objectobj){FoofooItem=objasFoo;if(fooItem==null){returnfalse;}returnfooItem.FooId==this.FooId;}publicoverrideintGetHashCode(){//Whichispreferred?returnbase.GetHashCode();//returnthis.FooId.Ge

c# - 为什么重写 Equals 方法时重写 GetHashCode 很重要?

给定以下类(class)publicclassFoo{publicintFooId{get;set;}publicstringFooName{get;set;}publicoverrideboolEquals(objectobj){FoofooItem=objasFoo;if(fooItem==null){returnfalse;}returnfooItem.FooId==this.FooId;}publicoverrideintGetHashCode(){//Whichispreferred?returnbase.GetHashCode();//returnthis.FooId.Ge

c# - 具有 Equals 和 GetHashCode 辅助方法的库,适用于 .NET

谷歌Guava提供了很好的帮助程序来实现equals和hashCode,如下例所示:publicinthashCode(){returnObjects.hashCode(lastName,firstName,gender);}Microsoft.NET是否有类似的库? 最佳答案 我不明白你为什么需要一个。如果您想为3个不同的项目创建基于默认GetHashCode的哈希码,则只需使用:Tuple.Create(lastName,firstName,gender).GetHashCode()这将归结为:inth1=lastName.Ge

c# - .NET 中 String.GetHashCode() 的哈希质量和稳定性?

我想知道.NET中的String.GetHashCode()实现产生的散列质量和散列稳定性?关于质量,我主要关注算法方面(因此,哈希的质量会影响大型哈希表,而不是出于安全考虑)。然后,关于稳定性,我想知道从一个.NET版本到下一个版本可能会出现的潜在版本控制问题。我们将不胜感激这两个方面的一些亮点。 最佳答案 我无法向您提供有关质量的任何详细信息(尽管我认为它非常好,因为字符串是框架的核心类之一,很可能用作哈希键)。但是关于稳定性,不同版本的框架产生的hashcode不保证是一样的,过去也有变化,所以你绝对不能指望hashcode在

c# - 为什么 C# 不为集合实现 GetHashCode?

我正在将一些东西从Java移植到C#。在Java中,ArrayList的hashcode取决于其中的项目。在C#中,我总是从List...中获取相同的哈希码这是为什么?对于我的一些对象,哈希码需要不同,因为它们列表属性中的对象使对象不相等。我希望哈希码对于对象的状态始终是唯一的,并且仅当对象相等时才等于另一个哈希码。我错了吗? 最佳答案 为了正常工作,哈希码必须是不可变的——对象的哈希码必须永不改变。如果对象的哈希码发生变化,则包含该对象的任何字典都将停止工作。由于集合不是不可变的,它们不能实现GetHashCode。相反,它们继承

c# - 使用 IEqualityComparer 和 Equals/GethashCode Override 有什么区别?

当我使用字典时,有时我必须更改默认的Equals含义才能比较键。我看到,如果我重写键类上的Equals和GetHashCode,或者我创建一个实现IEqualityComparer的新类,我会得到相同的结果。那么使用IEqualityComparer和Equals/GethashCodeOverride有什么区别呢?两个例子:classCustomer{publicstringname;publicintage;publicCustomer(stringn,inta){this.age=a;this.name=n;}publicoverrideboolEquals(objectobj)

c# - 为什么 String.GetHashCode() 在 32 位和 64 位版本的 CLR 中实现不同?

string.GetHashCode()的32位和64位版本之间的差异背后的技术原因是什么?更重要的是,为什么64位版本在遇到NUL字符时似乎会终止其算法?例如,以下表达式在64位CLR下运行时均返回true。"\0123456789".GetHashCode()=="\0987654321".GetHashCode()"\0AAAAAAAAA".GetHashCode()=="\0BBBBBBBBB".GetHashCode()"\0The".GetHashCode()=="\0Game".GetHashCode()当我们在字典中使用此类字符串作为键时,这种行为(错误?)表现为性能问

c# - 覆盖 GetHashCode()

在thisarticle,JonSkeet提到他通常使用这种算法来覆盖GetHashCode()。publicoverrideintGetHashCode(){unchecked//Overflowisfine,justwrap{inthash=17;//Suitablenullitychecksetc,ofcourse:)hash=hash*23+Id.GetHashCode();returnhash;}}现在,我已经尝试使用它,但Resharper告诉我方法GetHashCode()应该只使用只读字段进行哈希处理(尽管它编译得很好)。什么是好的做法,因为现在我真的不能让我的字段只读

c# - 为包含集合的对象实现 GetHashCode()

考虑以下对象:classRoute{publicintOrigin{get;set;}publicintDestination{get;set;}}路由实现相等运算符。classRouting{publicListPaths{get;set;}}我使用下面的代码为Routing对象实现GetHashCode方法,它似乎可以工作,但我想知道这是否是正确的方法?我依靠平等检查,因为我不确定我想我会问你们。我可以只对哈希码求和吗?还是我需要做更多的魔术才能保证达到预期的效果?publicoverrideintGetHashCode()=>{return(Paths!=null?(Paths.

c# - 定义运算符 == 但不定义 Equals() 或 GetHashCode() 有什么问题?

对于下面的代码publicstructPerson{publicintID;publicstaticbooloperator==(Persona,Personb){returna.Equals(b);}publicstaticbooloperator!=(Persona,Personb){return!a.Equals(b);}}为什么编译器会给我这些警告?不定义下面的方法有什么问题?warningCS0660:'Person'definesoperator==oroperator!=butdoesnotoverrideObject.Equals(objecto)warningCS06