2

Bouncy Castle を調べて、そのハッシュ アルゴリズムのパフォーマンスが .NET Framework のパフォーマンスとどのように比較されるかを確認しましたが、あまり良くないように見えます。MD5 実装は .NET より約 6 倍遅く、SHA256 実装は .NET より約 3 倍遅いです。

ドキュメントが事実上存在しないため、Bouncy Castle を正しく使用していることを確認したいと思います。これが私がやっていることです:

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Digests;

public byte[] Hash(string filename)
{
  IDigest hash = new Sha256Digest();

  byte[] result = new byte[hash.GetDigestSize()];

  using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, 
    FileShare.Delete | FileShare.ReadWrite))
  {
    byte[] buffer = new byte[4092];
    int bytesRead;

    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
    {
      hash.BlockUpdate(buffer, 0, bytesRead);
    }

    hash.DoFinal(result, 0);
  }

  return result;
}

編集

比較のために、.NET での方法を次に示します。

public byte[] Hash(string filename)
{
  byte[] hashBytes;
  HashAlgorithm hash = new SHA256CryptoServiceProvider();

  using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, 
    FileShare.Delete | FileShare.ReadWrite))
  {
    try
    {
      hashBytes = hash.ComputeHash(fs);
    }
    finally
    {
      hash.Clear();
    }
  }

  return hashBytes;
}
4

4 に答える 4

1

2 つのアルゴリズムが大きく異なり、3 ~ 6 倍の差が生じる可能性もありますが、I/O の違いが原因である可能性もあります。FileStream を .NET 実装に渡すことで、Bouncy Castle の例では行っていない、より優れた I/O パフォーマンス (ハッシュと読み取りの同時実行など) を実現するために、内部で巧妙なことを行うことができます。

これをテストするには、次のいずれかを実行できます。

  1. 2 つの例をできるだけ似たものにしてください (これが私がすることです)。.NET HashAlgorithm で TransformBlock と TransformFinalBlock を使用すると、Bouncy Castle テストにより似たものになります。

  2. Bouncy Castle コードの I/O 最適化を試みて、.NET 実装のパフォーマンスに近づくことができるかどうかを確認してください。

これは論外かもしれませんが。.NET 実装がニーズを満たしている場合、それがアプリケーションに最適である可能性があります。Bouncy Castles の実装に手動で追加する必要があるいくつかのパフォーマンス特性が既に組み込まれているようです。

于 2012-08-21T18:09:07.140 に答える
1
  1. 正しく使っているようです。

    • よくわからない場合は、ハッシュを .NET ハッシュと比較してコードをテストしてください。
    • さまざまなブロック サイズをテストして、コードのパフォーマンスが向上するかどうかを確認することもできます。4092 は、より大きなストリームには最適なサイズではない可能性があります。また、ブロック サイズを 2 の倍数にしてみてください。
  2. また、両方の実装のパフォーマンスの違いについても正しいです。私の最新のテストでは、c# nuget での Bouncy Castle MD5 ハッシュは、.NET ハッシュよりも ~X2 遅いことが示されました。

MD5 ハッシュ時間 (ミリ秒)

于 2019-08-12T10:52:43.117 に答える