Как сравнить строчку, в которой написан хеш с настоящим хешем?
У меня есть строка, в которой лежит прямой хеш 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 шт):
Вам не стоит сравнивать строки, ведь настоящий тип хэша — массив байт.
Сначала сконвертируйте вашу строку в массив байт заранее:
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, будет работать, хотя и немного менее эффективно.