gpt4 book ai didi

C# 散列多个字节数组 block

转载 作者:行者123 更新时间:2023-11-30 20:53:23 25 4
gpt4 key购买 nike

我正在尝试通过循环读取 FileStream 中的 1024 字节并使用 TransformBlock 函数来散列文件。我需要这个来理解将多个字节数组散列为一个散列的机制。这将使我不仅可以散列文件,还可以散列文件夹。我使用了这个 stackoverflow 问题:Hashing multiple byte[]'s together into a single hash with C#?这个 msdn 示例:http://msdn.microsoft.com/en-us/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 计算的哈希值不一致。

只是为了确定:我在返回的字节数组上使用的十六进制算法:

    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 的最后一个 block 的长度是错误的(除非文件大小是缓冲区大小的倍数)。您需要传递从文件中读取的实际字节数:

md5.TransformBlock(buf, 0, newnum, buf, 0);

此外,我不确定您为什么使用 newbuf...原始缓冲区仅用于第一个 block ,然后您对所有后续 block 使用 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);

...
}

关于C# 散列多个字节数组 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20048328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com