|
.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」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


