簡體   English   中英

StringComparer.InvariantCultureIgnoreCase Equals與GetHashCode不同意對於相等的對象

[英]StringComparer.InvariantCultureIgnoreCase Equals vs GetHashCode disagree for equal objects

StringComparer.InvariantCultureIgnoreCase Equals為“”vs“\\ 0”返回true,但GetHashCode為這兩個字符串返回不同的值。 這是一個錯誤嗎?

var sc = StringComparer.InvariantCultureIgnoreCase;
string s1 = "";
string s2 = "\0";
Console.WriteLine( sc.Equals(s1, s2)  );
Console.WriteLine( sc.GetHashCode(s1) );
Console.WriteLine( sc.GetHashCode(s2) );

回報

True
0
-1644535362

我認為GetHashCode應該為'equal'字符串返回相同的值,所以這是一個錯誤嗎?

那兩個字符串不是按位等於。 它們有兩種不同的長度。 因此,哈希碼算法在這里是合理的。

字符串比較算法在進行比較時必須忽略\\0 查看了源代碼 :它正在進行某種加/減比較算法,以確定事情是否不同。

GetHashCode只暗示值可能相等,不一定是。 逆並不總是正確的,您可以覆蓋任何類型的==運算符或.Equals ,並在哈希碼不一致時生成true

這是GetHashCode 看起來它正在使用原始字節進行計算。

你可能偶然發現了.NET庫中一個不起眼的錯誤,但我猜這是一個邊緣情況。

然后再次 - 您正在使用字符串比較器。 不是string.Equals方法或string.GetHashCode 注意Console.WriteLine("\\0".Equals("")); 產生false

如果你想要一個能讓它同意的字符串比較器,我相信 StringComparer.OrdinalIgnoreCase可以做到這一點,因為它分別查看每個字符,而不是整理值。 看起來兩者只是漏斗到相同的角色比較方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM