gpt4 book ai didi

c# - StringComparer.InvariantCultureIgnoreCase Equals vs GetHashCode 不同意相同的对象

转载 作者:太空狗 更新时间:2023-10-29 19:48:15 26 4
gpt4 key购买 nike

StringComparer.InvariantCultureIgnoreCase Equals 对“”与“\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 应该为“相等”字符串返回相同的值,这是一个错误吗?

最佳答案

这 2 个字符串按位不相等。它们有 2 种不同的长度。因此,哈希码算法在这里是合理的。

字符串比较算法在进行比较时必须忽略 \0。我 looked into the source : 它正在执行某种加/减比较算法以查明情况是否不同。

GetHashCode 仅表示值可能 相等,但不一定相等。反之并不总是正确的,您可以覆盖任何类型的 == 运算符或 .Equals 并让它在哈希码时生成 true不同意。

这是 GetHashCode .看起来它正在使用原始字节进行计算。

您可能无意中发现了 .NET 库中的一个不起眼的错误,但我猜这是一种边缘情况。

再一次 - 你正在使用一个字符串比较器。不是 string.Equals 方法或 string.GetHashCode。请注意 Console.WriteLine("\0".Equals("")); 生成 false

如果您想要一个能让它同意的字符串比较器,我相信 StringComparer.OrdinalIgnoreCase 可以解决问题,因为它会分别查看每个字符,而不是对值进行整理。 看起来两者都采用了相同的字符比较方法。

关于c# - StringComparer.InvariantCultureIgnoreCase Equals vs GetHashCode 不同意相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54243461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com