微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C#中为大型文件创建校验和的最快方法是什么

如何解决在C#中为大型文件创建校验和的最快方法是什么

这里的问题是一次SHA256Managed读取4096个字节(继承FileStream并重写Read(byte[], int, int)以查看它从文件流中读取了多少字节),这对于磁盘IO而言太小了。

为了加快速度(2分钟,我的机器SHA256,1分钟MD5哈希上2 GB的文件)裹FileStreamBufferedStream,并设置合理大小的缓冲区大小(我试过〜1 MB缓存):

// Not sure if BufferedStream should be wrapped in using block
using(var stream = new BufferedStream(File.OpenRead(filePath), 1200000))
{
    // The rest remains the same
}

解决方法

我必须在某些计算机上同步大文件。文件最大可以为6GB。同步将每隔几周进行一次。我无法考虑文件名,因为它们可以随时更改。

我的计划是在目标PC和源PC上创建校验和,然后将带有校验和的所有文件复制到目标中,这些文件尚未在目标中。我的第一次尝试是这样的:

using System.IO;
using System.Security.Cryptography;

private static string GetChecksum(string file)
{
    using (FileStream stream = File.OpenRead(file))
    {
        SHA256Managed sha = new SHA256Managed();
        byte[] checksum = sha.ComputeHash(stream);
        return BitConverter.ToString(checksum).Replace("-",String.Empty);
    }
}

问题是运行时:
-带有1.6 GB文件的SHA256-> 20分钟
-带有1.6 GB文件的MD5-> 6.15分钟

是否有更好(更快)的方法来获取校验和(也许具有更好的哈希函数)?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。