Отличие хэш суммы 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 шт):
Потому что вы перекодируете файл в строку и обратно, используя разные кодировки для чтения и записи. Но можно вообще без перекодировок.
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));