Вот функция, которая должна вычислять значения хеш-функции для файлов. Но время от времени я всегда получаю неправильные хэш-коды.
string filePath = @"G:\TV\movie.ts"; // about 10 GByte
private void Test()
{
for (int i = 0; i < 99; i++)
{
byte[] bytes;
try
{
var SHA256 = System.Security.Cryptography.SHA256.Create();
var MD5 = System.Security.Cryptography.MD5.Create();
var SHA512 = System.Security.Cryptography.SHA512.Create();
using (var stream = File.OpenRead(filePath))
{
stream.Position = 0;
bytes = MD5.ComputeHash(stream);
Debug.Print(i + ": " + BitConverter.ToString(bytes).Replace("-", ""));
stream.Position = 0;
bytes = SHA256.ComputeHash(stream);
Debug.Print(i + ": " + BitConverter.ToString(bytes).Replace("-", ""));
stream.Position = 0;
bytes = SHA512.ComputeHash(stream);
Debug.Print(i + ": " + BitConverter.ToString(bytes).Replace("-", ""));
}
MD5.Dispose();
SHA256.Dispose();
SHA512.Dispose();
}
catch (IOException e)
{
Debug.Print(e.ToString());
}
}
}
Результат для одного большого файла (фильм ~ 10 ГБ).
Для MD5 (короткий) и SHA256 (средний) я выделил отклонения жирным шрифтом.
Когда вы посмотрите на результаты SHA512 (длинные), вы увидите, что из 8х, которые я провел, я получил
4x1B04E14AD6A0D1CC9D131D37D92C90146C118655B50935033A67BC0F436E9CAC424B569CCDB392D12B477DA751F30CD677023D78A55AA3CC97F8F8CD9F941D97
3xF9A6C6C61579FF989F17FB78DD23F1A4B6290588002EE58FB2C9427C75DD35D4745D15DB868CFCC94A49C9227E6C058FB89E862E50E8A06C527FC8C72EDCAFC7
1x1A3050206C8F3E94FC918F140215ADF2A9F463EAF083D421F5AF3FC450A634E9DF04C62889C3F295D504DDE34014CEF4A908C01D26770E250311816F77826B23
Это показывает, что когда это идет не так, это часто приводит к тому же неправильному хешу.
Итак, вопрос в том, почему я время от времени получаю неправильные результаты с каждым алгоритмом?
0: 920651841DF511BC45B51DABF76F08D8
0: ADA7EDB960A0EBB298E6BAB8FBF5E2C3D7D2E170B2C19B0B6432A469F2A398B7
0: 1B04E14AD6A0D1CC9D131D37D92C90146C118655B50935033A67BC0F436E9CAC424B569CCDB392D12B477DA751F30CD677023D78A55AA3CC97F8F8CD9F941D97
1: 920651841DF511BC45B51DABF76F08D8
1: ADA7EDB960A0EBB298E6BAB8FBF5E2C3D7D2E170B2C19B0B6432A469F2A398B7
1: 1A3050206C8F3E94FC918F140215ADF2A9F463EAF083D421F5AF3FC450A634E9DF04C62889C3F295D504DDE34014CEF4A908C01D26770E250311816F77826B23 * 10
2: 920651841DF511BC45B51DABF76F08D8
2: ADA7EDB960A0EBB298E6BAB8FBF5E2C3D7D2E170B2C19B0B6432A469F2A398B7
2: 1B04E14AD6A0D1CC9D131D37D92C90146C118655B50935033A67BC0F436E9CAC424B569CCDB392D12B477DA751F30CD677023D78A55AA3CC97F8F8CD9F941D97
3: 944638B455C6C4DBF1B4149B16360C4E
3: ADA7EDB960A0EBB298E6BAB8FBF5E2C3D7D2E170B2C19B0B6432A469F2A398B7
3: F9A6C6C61579FF989F17FB78DD23F1A4B6290588002EE58FB2C9427C75DD35D4745D15DB868CFCC94A49C9227E6C058FB89E862E50E8A06C527FC8C72EDCAFC7 * 1030
4: 920651841DF511BC45B51DABF76F08D8
4: ADA7EDB960A0EBB298E6BAB8FBF5E2C3D7D2E170B2C19B0B6432A469F2A398B7
4: 1B04E14AD6A0D1CC9D131D37D92C90146C118655B50935033A67BC0F436E9CAC424B569CCDB392D12B477DA751F30CD677023D78A55AA3CC97F8F8CD9F941D97
5: 920651841DF511BC45B51DABF76F08D8
5: 03DD7ADCA595F925E9226D1022D2FFB06F59710677E01472E4267E635DC4020A
5: F9A6C6C61579FF989F17FB78DD23F1A4B6290588002EE58FB2C9427C75DD35D4745D15DB868CFCC94A49C9227E6C058FB89E862E50E8A06C527FC8C72EDCAFC7 * 10
6: 920651841DF511BC45B51DABF76F08D8
6: ADA7EDB960A0EBB298E6BAB8FBF5E2C3D7D2E170B2C19B0B6432A469F2A398B7
6: 1B04E14AD6A0D1CC9D131D37D92C90146C118655B50935033A67BC0F436E9CAC424B569CCDB392D12B477DA751F30CD677023D78A55AA3CC97F8F8CD9F941D97
7: 945F30E57094D2725B727D69F7BE7F4C
7: ADA7EDB960A0EBB298E6BAB8FBF5E2C3D7D2E170B2C19B0B6432A469F2A398B7
7: F9A6C6C61579FF989F17FB78DD23F1A4B6290588002EE58FB2C9427C75DD35D4745D15DB868CFCC94A49C9227E6C058FB89E862E50E8A06C527FC8C72EDCAFC7 * 10