Что вычисляет GetHashCode()
при вызове в массиве byte[]
?
2 массива данных с равным содержимым не обеспечивают одинаковый хэш.
GetHashCode() в массиве byte []
Ответ 1
Как и другие не примитивные встроенные типы, он просто возвращает что-то произвольное. Он определенно не пытается хешировать содержимое массива. См. этот ответ.
Ответ 2
Массивы в .NET не переопределяют Equals
или GetHashCode
, поэтому значение, которое вы получите, в основном основано на ссылочном равенстве (т.е. реализации по умолчанию в Object
) - для равенства значений вам понадобится свернуть собственный код (или найти его у третьего лица). Вы можете реализовать IEqualityComparer<byte[]>
, если вы пытаетесь использовать массивы байтов как ключи в словаре и т.д.
EDIT: Здесь используется многоразовый сопоставитель равенства массива, который должен быть точным до тех пор, пока элемент массива правильно выполняет равенство. Обратите внимание, что вы не должны мутировать массив после использования его в качестве ключа в словаре, иначе вы не сможете его найти снова - даже с той же ссылкой.
using System;
using System.Collections.Generic;
public sealed class ArrayEqualityComparer<T> : IEqualityComparer<T[]>
{
// You could make this a per-instance field with a constructor parameter
private static readonly EqualityComparer<T> elementComparer
= EqualityComparer<T>.Default;
public bool Equals(T[] first, T[] second)
{
if (first == second)
{
return true;
}
if (first == null || second == null)
{
return false;
}
if (first.Length != second.Length)
{
return false;
}
for (int i = 0; i < first.Length; i++)
{
if (!elementComparer.Equals(first[i], second[i]))
{
return false;
}
}
return true;
}
public int GetHashCode(T[] array)
{
unchecked
{
if (array == null)
{
return 0;
}
int hash = 17;
foreach (T element in array)
{
hash = hash * 31 + elementComparer.GetHashCode(element);
}
return hash;
}
}
}
class Test
{
static void Main()
{
byte[] x = { 1, 2, 3 };
byte[] y = { 1, 2, 3 };
byte[] z = { 4, 5, 6 };
var comparer = new ArrayEqualityComparer<byte>();
Console.WriteLine(comparer.GetHashCode(x));
Console.WriteLine(comparer.GetHashCode(y));
Console.WriteLine(comparer.GetHashCode(z));
Console.WriteLine(comparer.Equals(x, y));
Console.WriteLine(comparer.Equals(x, z));
}
}
Ответ 3
byte[]
наследует GetHashCode()
от object
, он не переопределяет его. Итак, вы получаете в основном реализацию object
.
Ответ 4
Если это не тот же экземпляр, он будет возвращать разные хэши. Я предполагаю, что он основан на адресе памяти, где он каким-то образом хранится.