.NET TIPS 進行状況を表示しながらハッシュ値を計算するには?[C#、VB]デジタルアドバンテージ 一色 政彦2010/01/21 |
|
|
「TIPS:SHA-1/SHA-2/MD5ハッシュ値を計算するには?」ではハッシュ値(=データを元に生成した固定長の一意な値)を計算する方法を説明した。その方法とは、アルゴリズム・クラスのComputeHashメソッドを呼び出すというものだった。
しかし、この方法で大容量のデータ(例えば動画ファイルなど)のハッシュ値を計算すると、メソッドが完了するまでに時間がかかる場合がある。このため、UI(ユーザー・インターフェイス)を持つアプリケーションでは表示が更新されずに、エンド・ユーザーはアプリケーションが固まったように感じるかもしれない。これを回避する1つの手段は、計算途中の進行状況をエンド・ユーザーに表示することである。
そこで本稿では、進行状況を表示しながらハッシュ値を計算する方法を紹介する。
●進行状況を表示しながらハッシュ値を計算する方法
その方法とは、ComputeHashメソッドの代わりに、TransformBlockメソッドおよびTransformFinalBlockメソッドを利用することである。
これらのメソッドは、大きなデータを小分けにしてハッシュ値を計算するためのものである。TransformBlockメソッドで先頭から小量ずつデータを処理していき、最後のデータの処理でTransformFinalBlockメソッドを呼び出すことで、最終的なハッシュ値が計算できる。
つまり、TransformBlockメソッドとTransformFinalBlockメソッドを呼び出す合間合間で、進ちょく状況を計算して、ユーザーに表示すればよいわけだ。
それぞれのメソッドの構文は以下のようになっている。
TransformBlockメソッド
- 第1パラメータ(Byte[]):入力データ(=大容量データ全体のバイト配列)。
- 第2パラメータ(Int32):入力データの開始オフセット(=大容量データのうち、小量データとして使用する開始位置)。
- 第3パラメータ(Int32):入力データで処理するバイト数(=小量データとして使用するバイト配列の数)。
- 第4パラメータ(Byte[]):出力データ(=今回処理された少量データを受け取る出力先のバイト配列)。
- 第5パラメータ(Int32):出力データの開始オフセット(=出力先のバイト配列内の書き込み開始位置)。
- 戻り値(Int32):処理したバイト数。
TransformFinalBlockメソッド
- 第1パラメータ(Byte[]):入力データ(=大容量データ全体のバイト配列)。
- 第2パラメータ(Int32):入力データの開始オフセット(=大容量データのうち、小量データとして使用する開始位置)。
- 第3パラメータ(Int32):入力データで処理するバイト数(=小量データとして使用するバイト配列の数)。
- 戻り値(System.Byte[]):出力データ(=今回処理されたデータのバイト配列)。
いずれのメソッドも戻り値はエラー・チェックぐらいにしか使い道はないだろう。本稿では戻り値は無視する。
また、TransformBlockメソッドの第4パラメータでは処理済みデータのバイト配列を受け取れるが、これも使い道があまりない。出力データが不要な場合は、第4パラメータにnull/Nothingを、第5パラメータには0を指定するとよい。これにより、出力データのコピー処理が発生しないので、若干処理速度が速まるはずだ。
それでは、この2つのメソッドを使ったサンプル・コードを示す。
次のコードは、大容量の動画ファイル・データを1024バイトずつ先頭から順に処理していき、その間、0〜100%の1%ずつ進行状況を表示する。最終的に、SHA256アルゴリズムにより動画ファイル全体のデータのハッシュ値を求め、その結果をコンソール出力している。なお、進行状況の表示方法については、「TIPS:コンソール・アプリケーションで進行状況を表示するには?」を参照してほしい。
|
||
進行状況を表示しながらSHA256アルゴリズムによりハッシュ値を計算するサンプル・コード(上:C#、下:VB) | ||
本質とは関係のないコードを短くするために、.NET Framework 2.0以降でしか使えない(つまり.NET Framework 1.xで使えない)クラスやメソッド(例:File.ReadAllBytesメソッドなど)を利用しているので注意してほしい。 |
上記のコードでは、SHA256CryptoServiceProviderクラスのハッシュ・アルゴリズムを利用しているが、.NETではこれ以外にもさまざまなハッシュ・アルゴリズムに対応している。詳しくは「TIPS:SHA-1/SHA-2/MD5ハッシュ値を計算するには?」を参照されたい。
カテゴリ:クラス・ライブラリ 処理対象:暗号 使用ライブラリ:MD5クラス(System.Security.Cryptography名前空間) 使用ライブラリ:SHA1クラス(System.Security.Cryptography名前空間) 使用ライブラリ:SHA256クラス(System.Security.Cryptography名前空間) 使用ライブラリ:SHA384クラス(System.Security.Cryptography名前空間) 使用ライブラリ:SHA512クラス(System.Security.Cryptography名前空間) 使用ライブラリ:RIPEMD160クラス(System.Security.Cryptography名前空間) 関連TIPS:SHA-1/SHA-2/MD5ハッシュ値を計算するには? 関連TIPS:コンソール・アプリケーションで進行状況を表示するには? |
|
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|