xan*_*der 4 c# hash file filestream
我希望能够计算 C# 中文件的任意大小的文件块的哈希值。
例如:计算 4gb 文件中第 3GB 的哈希值。
主要问题是我不想在内存中加载整个文件,因为可能有多个文件,并且偏移量可能非常任意。
AFAIK,HashAlgorithm.ComputeHash 允许我使用字节缓冲区或流。该流允许我有效地计算哈希值,但针对整个文件,而不仅仅是针对特定块。
我正在考虑创建一个备用 FileStream 对象并将其传递给 ComputeHash,在其中我将重载 FileStream 方法并只读取文件中的某个块。
有没有比这更好的解决方案,最好使用内置的 C# 库?谢谢。
可以直接使用TransformBlockand 。TransformFinalBlock这与什么非常相似HashAlgorithm.ComputeHash内部的做法非常相似。
就像是:
using(var hashAlgorithm = new SHA256Managed())
using(var fileStream = new File.OpenRead(...))
{
fileStream.Position = ...;
long bytesToHash = ...;
var buf = new byte[4 * 1024];
while(bytesToHash > 0)
{
var bytesRead = fileStream.Read(buf, 0, (int)Math.Min(bytesToHash, buf.Length));
hashAlgorithm.TransformBlock(buf, 0, bytesRead, null, 0);
bytesToHash -= bytesRead;
if(bytesRead == 0)
throw new InvalidOperationException("Unexpected end of stream");
}
hashAlgorithm.TransformFinalBlock(buf, 0, 0);
var hash = hashAlgorithm.Hash;
return hash;
};
Run Code Online (Sandbox Code Playgroud)