Как сравнить строчку, в которой написан хеш с настоящим хешем?

У меня есть строка, в которой лежит прямой хеш 7z архива. Моя задача в том, чтобы вычислить хеш архива, который я скачал и сравнить его с тем хешем, который написан в строке. Пример строки:

string archiveHash="d3b2a709b15a6d66df4205f825add2b8";

Вот как я получал хеш скаченного архива:

        byte[] buffer;
        int bytesRead;
        long size;
        long totalBytesRead = 0;
        byte[] hashCheckValue;

        using(Stream fileStream = File.OpenRead(zipFile))
        {
            size = fileStream.Length;

            using(HashAlgorithm hasher = MD5.Create())
            {
                do
                {
                    buffer = new byte[4096];

                    bytesRead = fileStream.Read(buffer, 0, buffer.Length);
                    totalBytesRead += bytesRead;

                    hasher.TransformBlock(buffer, 0, bytesRead, null, 0);
                }
                while (bytesRead != 0);

                hasher.TransformFinalBlock(buffer, 0, 0);

                hashCheckValue = hasher.Hash;
            }
        }

То есть по факту мне нужно сравнить hashCheckValue с содержимым строчки archiveHash. Подскажите, как это можно сделать?


Ответы (1 шт):

Автор решения: VladD

Вам не стоит сравнивать строки, ведь настоящий тип хэша — массив байт.

Сначала сконвертируйте вашу строку в массив байт заранее:

byte[] hashAsBytes = new byte[archiveHash.Length / 2];
for (int i = 0; i < hashAsBytes.Length; i++)
{
    if (!byte.TryParse(archiveHash.AsSpan(i * 2, 2),
                       NumberStyles.HexNumber,
                       CultureInfo.InvariantCulture,
                       out hashAsBytes[i]))
        throw new FormatException("Wrong hash");
}

Затем сравнивайте два массива байт при помощи SequenceEqual.

hashCheckValue.SequenceEqual(hashAsBytes)

Современный метод, избегающий создания подстроки (через Span), доступен, начиная с .NET Core 2.1.

Для более старых версий .NET (например, для .NET Framework), замените AsSpan на Substring, будет работать, хотя и немного менее эффективно.

→ Ссылка