繁体   English   中英

C#散列多个字节数组块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM