Как мне создать хеш-код из байтового массива в C #? - PullRequest
47 голосов
/ 19 августа 2008

Скажем, у меня есть объект, который хранит байтовый массив, и я хочу иметь возможность эффективно генерировать для него хеш-код. Я использовал криптографические хеш-функции для этого в прошлом, потому что они просты в реализации, но они выполняют намного больше работы, чем должны быть криптографически односторонними, и меня это не волнует (я просто использую хеш-код как ключ к хеш-таблице).

Вот что у меня сегодня:

struct SomeData : IEquatable<SomeData>
{
    private readonly byte[] data;
    public SomeData(byte[] data)
    {
        if (null == data || data.Length <= 0)
        {
            throw new ArgumentException("data");
        }
        this.data = new byte[data.Length];
        Array.Copy(data, this.data, data.Length);
    }

    public override bool Equals(object obj)
    {
        return obj is SomeData && Equals((SomeData)obj);
    }

    public bool Equals(SomeData other)
    {
        if (other.data.Length != data.Length)
        {
            return false;
        }
        for (int i = 0; i < data.Length; ++i)
        {
            if (data[i] != other.data[i])
            {
                return false;
            }
        }
        return true;
    }
    public override int GetHashCode()
    {
        return BitConverter.ToInt32(new MD5CryptoServiceProvider().ComputeHash(data), 0);
    }
}

Есть мысли?


dp: Вы правы, что я пропустил проверку в Equals, я обновил ее. Использование существующего хеш-кода из байтового массива приведет к равенству ссылок (или, по крайней мере, той же концепции, переведенной в хеш-коды). например:

byte[] b1 = new byte[] { 1 };
byte[] b2 = new byte[] { 1 };
int h1 = b1.GetHashCode();
int h2 = b2.GetHashCode();

С этим кодом, несмотря на то, что два байтовых массива имеют одинаковые значения внутри них, они ссылаются на разные части памяти и приведут (вероятно) к разным хеш-кодам. Мне нужно, чтобы хэш-коды для двух байтовых массивов с одинаковым содержимым были равны.

Ответы [ 11 ]

0 голосов
/ 20 августа 2008

RuntimeHelpers.GetHashCode может помочь:

От MSDN:

Служит хэш-функцией для особый тип, подходящий для использования в алгоритмы хеширования и структуры данных такой как хеш-таблица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...