相同值的两个字节数组不相等

时间:2013-05-11 09:45:20

标签: c# .net bytearray

在编写程序时,我最近遇到了一个奇怪的问题。在使用==运算符时,两个字节的八个值的数组(每个值具有相同的值)被报告为不相等,GetHashCode()的值也不同。

byte[] id = new byte[8] {
    0x00, 0x00, 0x00, 0x00,
    0xF8, 0x00, 0x00, 0x00
};
byte[] od = new byte[8] { 
    0x00, 0x00, 0x00, 0x00,
    0xF8, 0x00, 0x00, 0x00 
};

Console.WriteLine(id == od);
Console.WriteLine(id.GetHashCode());
Console.WriteLine(od.GetHashCode());
Console.ReadLine();

此程序输出到控制台如下:

False
45653674
41149443

任何人都可以提供一些输入,说明为什么这些字节数组不被认为是相同的?

3 个答案:

答案 0 :(得分:5)

  

任何人都可以提供一些输入,说明为什么这些字节数组不被认为是相同的?

这非常简单:数组类型不会覆盖EqualsGetHashCode(或确实ToString) - 因此您可以从System.Object获得实现。 Equals中的System.Object实现仅比较引用标识,GetHashCode尝试尽可能为每个对象提供唯一的哈希码。你有两个独立的数组对象,所以它们是不相等的(对对象的引用是不同的),它们的哈希码也不太可能相等。

数组类型可以覆盖这些方法,但它们不会。您可以编写自己的IEqualityComparer<T>实现,尽管如此。请注意,使用数组作为哈希表键通常是一个坏主意,因为数组总是可变的。你必须确定不会改变数组,这会改变哈希码。

请注意,标准集合也不会覆盖这些方法 - 例如List<T>等。

根据我的经验,比较数组的最常见用法是单元测试 - 通常单元测试框架有方法为你做这个(例如在CollectionAsserts类中)。或LINQ提供Enumerable.SequenceEqual,如其他答案所述。

如果您可以告诉我们您正在尝试做的事情,我们可以为您提供更多帮助。

答案 1 :(得分:4)

这是因为idod是两个独立的数组,具有不同的指针。 如果您想知道他们的条目是否相同,您应该检查每个值的相等性。

答案 2 :(得分:0)

这是因为idod指向不同的对象。

您可以使用Enumerable类来比较数组的内容

Enumerable.SequenceEqual(id, od);