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 次 |
| 最近记录: |