Отличие хэш суммы MD5 на основе текста и на основе файла

Есть программа, суть которой принимать HTTP запрос с файлом и в ответе нужно отправить MD5 хэш сумму. Я выяснил, что можно считать хэш на основе текста и на основе файла и в некоторых моментах они отличаются, но из-за чего - я не понял.

Изучив примеры, написал следующий код

FileStream fstream = File.OpenRead(pathStr + @"\" + partnerName + @"\IN\" + strname);
byte[] array = new byte[fstream.Length];
fstream.Read(array, 0, array.Length);
string textFromFile = win1251.GetString(array);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(Encoding.Default.GetBytes(textFromFile));
fstream.Close();

Проблема вот в чем. Если я собираю в VS2019 консольное приложение с этим кодом, то у меня хэш считается как мне надо - из текста. НО если попытаться собрать проект как службу Windows, то этот же самый код считает сумму из файла. Проверяю я это в Notepad++.

Помогите научить сборку службы Windows считать хэш на основе текста


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

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

Потому что вы перекодируете файл в строку и обратно, используя разные кодировки для чтения и записи. Но можно вообще без перекодировок.

byte[] array = File.ReadAllBytes(Path.Combine(pathStr, partnerName, "IN", strname));
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(array);

Console.WriteLine(BitConverter.ToString(retVal).Replace("-", "").ToLowerInvariant();

Вот так вот просто.

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

MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal;
using (Stream stream = File.OpenRead(Path.Combine(pathStr, partnerName, "IN", strname)))
{
    retVal = md5.ComputeHash(stream);
}

Если нужна перекодировка из Win-1251 в UTF-8, то получится вот так

byte[] array = File.ReadAllBytes(Path.Combine(pathStr, partnerName, "IN", strname));
string text = win1251.GetString(array);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(Encoding.UTF8.GetBytes(text));
→ Ссылка