[英]StringComparer.InvariantCultureIgnoreCase for char
[英]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.