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) );
Run Code Online (Sandbox Code Playgroud)
回报
True
0
-1644535362
Run Code Online (Sandbox Code Playgroud)
我认为GetHashCode应该为'equal'字符串返回相同的值,所以这是一个错误吗?
Dan*_*ite -3
这两个字符串按位不相等。它们有 2 种不同的长度。因此,这里的哈希码算法是合理的。
\0
进行比较时必须忽略字符串比较算法。我查看了源代码:它正在执行某种加/减比较算法来找出情况是否不同。
GetHashCode
仅意味着值可能相等,但不一定相等。相反的情况并不总是正确,您可以覆盖任何类型的==
运算符或,并在哈希码不一致时.Equals
生成它。true
这里是GetHashCode
. 看起来它正在使用原始字节进行计算。
您可能偶然发现了 .NET 库中的一个不起眼的错误,但我猜测这是一个边缘情况。
再说一遍 - 您正在使用字符串比较器。不是string.Equals
方法或string.GetHashCode
。请注意,Console.WriteLine("\0".Equals(""));
产生false
.
如果您想要一个能够使其一致的字符串比较器,我相信 看起来两者都只是采用相同的字符比较方法。 StringComparer.OrdinalIgnoreCase
可以做到这一点,因为它单独查看每个字符,而不是对值进行整理。
归档时间: |
|
查看次数: |
225 次 |
最近记录: |