繁体   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