c# - 如何异步MD5计算? C#

标签 c# .net hash

如何异步使用计算 MD5 哈希值?

我有这个代码:

static string CalculateMD5(string filename)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            var hash = md5.ComputeHash(stream);
            return BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant();
        }
    }
}

我想对 1GB 的文件进行哈希处理,然后它使我的应用程序卡住 20 秒。

最佳答案

当您从文件中读取时,您可以使用 IO 绑定(bind)异步性。不幸的是,File 类和 MD5 类都不支持开箱即用。但可以手动完成:

static async Task<string> CalculateMD5Async(string filename)
{
  using (var md5 = System.Security.Cryptography.MD5.Create())
  {
    using (var stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true)) // true means use IO async operations
    {
      byte[] buffer = new byte[4096];
      int bytesRead;
      do
      {
        bytesRead = await stream.ReadAsync(buffer, 0, 4096);
        if (bytesRead > 0)
        {
          md5.TransformBlock(buffer, 0, bytesRead, null, 0);
        }
      } while (bytesRead > 0);

      md5.TransformFinalBlock(buffer, 0, 0);
      return BitConverter.ToString(md5.hash).Replace("-", "").ToUpperInvariant();
    }
  }

出于性能原因,您可能需要增加缓冲区大小。

关于c# - 如何异步MD5计算? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49858310/

相关文章:

arrays - 如何从 Perl 散列中删除空数组/引用?

java - 用于数据库持久化的多算法密码哈希结构

c# - mysql + .NET 连接器 : "Column ' CharacterID' cannot be null"

c# - 有时我如何验证某些字段?

c# - 如何在 Xamarin.Forms 中使用 BindableProperty.Create?

.NET 集合以支持 LIFO

algorithm - 哈希片段是否具有抗冲突性?

c# - log4net 正在记录所有级别,而不是我配置它要做的

c# - C# 可以像 Objective C 一样在 main 之前或之后运行代码吗

c# - C#中对象的内存地址