我有一个奇怪的问题。我有以下非常基本的代码:
private async Task<string> _CalculateChecksum(Stream strm)
{
System.Security.Cryptography.MD5 sha = System.Security.Cryptography.MD5.Create();
byte[] checksum = await sha.ComputeHashAsync(strm);
//return BitConverter.ToString(checksum).Replace("-", "");
return Convert.ToBase64String(checksum);
}
我想计算文件的哈希值。我先用SHA256试过。无论我是将散列算法从MD5更改为SHA256还是SHA512,不同文件生成的散列值总是相同的。例如:其中一个测试文件的大小约为4。比其他文件大。哈希与所有算法相同。我也尝试使用BitConverter.ToString
而不是Convert.ToBase64String
,但这并不重要,因为校验和字节数组的内容完全相同。
我也尝试过使用普通(非异步(方法,但结果是一样的。
有人知道为什么会发生这种事吗?
以下是散列部分的代码:
MemoryStream ms = new MemoryStream();
await file.CopyToAsync(ms);
string hash = await _CalculateChecksum(ms);
"文件";是包含正确值的IFormFile对象。
在await file.CopyToAsync(ms)
之后,内存流的位置在它的末尾。sha.ComputeHashAsync(strm)
计算当前位置之后的数据的散列,因此基本上是空流的散列。
尝试在调用_CalculateChecksum:之前将流的位置重置为起始位置
MemoryStream ms = new MemoryStream();
await file.CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);
string hash = await _CalculateChecksum(ms);