如何异步MD5计算?C#.



如何使用计算 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 绑定的异步性。不幸的是,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();
    }
  }

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

试试这个:

 private async void CalculateMd5_Click(object sender, EventArgs e)
    {
        var filePath = "Path/to/your/file";
        var md5hash = await CalculateMd5ForFileAsync(filePath);
    }
    private Task<string> CalculateMd5ForFileAsync(string filePath)
    {
        return new Task<string>(() => ComputeMd5HashForFile(filePath));
    }
    private string ComputeMd5HashForFile(string filePath)
    {
        using (var md5 = MD5.Create())
        {
            using (var stream = File.OpenRead(filePath))
            {
                var hash = md5.ComputeHash(stream);
                return BitConverter.ToString(hash).Replace("-", "").ToUpperInvariant();
            }
        }
    }

从 .NET 5(2020 年 11 月(开始,有一个可用的ComputeHashAsync

async Task<byte[]> ComputeFileHash(string filename)
{
    byte[] hash;
    using (FileStream fs = File.OpenRead(filename))
        hash = await MD5.Create().ComputeHashAsync(fs);
    return hash;
}

最新更新