[英]C# Hashing multiple byte array blocks
我试图通过循环从FileStream中读取1024个字节并使用TransformBlock函数来哈希文件。 我需要这样做来了解将多个字节数组散列为一个散列的机制。 这将使我不仅可以哈希文件,还可以哈希文件夹。 我使用了这个stackoverflow问题: 使用C#将多个byte []一起哈希到单个哈希中吗? 和此msdn示例: http : //msdn.microsoft.com/zh-cn/library/system.security.cryptography.hashalgorithm.transformblock.aspx
这是我现在拥有的代码:
public static byte[] createFileMD5(string path){
MD5 md5 = MD5.Create();
FileStream fs = File.OpenRead(path);
byte[] buf = new byte[1024];
byte[] newbuf = new byte[1024];
int num; int newnum;
num = fs.Read(buf,0,buf.Length);
while ((newnum = fs.Read(newbuf, 0, newbuf.Length))>0)
{
md5.TransformBlock(buf, 0, buf.Length, buf, 0);
num = newnum;
buf = newbuf;
}
md5.TransformFinalBlock(buf, 0, num);
return md5.Hash;
}
不幸的是,它计算的哈希值与我使用fciv计算的哈希值不对应。
只需确定:我在返回的字节数组上使用的hexing算法:
public static string byteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
您传递给TransformBlock
的长度对于最后一个块是错误的(除非文件大小是缓冲区大小的倍数)。 您需要传递从文件读取的实际字节数:
md5.TransformBlock(buf, 0, newnum, buf, 0);
另外,我不确定为什么要使用newbuf
...原始缓冲区仅用于第一个块,然后将newbuf
用于所有后续块。 这里没有理由使用第二个缓冲区。 供参考,这是我用来计算文件哈希的代码:
using (var stream = File.OpenRead(path))
{
var md5 = MD5.Create();
var buffer = new byte[8192];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
md5.TransformBlock(buffer, 0, read, buffer, 0);
}
md5.TransformFinalBlock(buffer, 0, 0);
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.