政彦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:コンソール・アプリケーションで進行状況を表示するには?」を参照してほしい。1.xで使えない)クラスやメソッド(例:File.ReadAllBytesメソッドなど)を利用しているので注意してほしい。上記のコードでは、SHA256CryptoServiceProviderクラスのハッシュ・アルゴリズムを利用しているが、.NETではこれ以外にもさまざまなハッシュ・アルゴリズムに対応している。詳しくは「TIPS:SHA-1/SHA-2/MD5ハッシュ値を計算するには?」を参照されたい。より自動抽出したものです。7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。TranslatorはPowerPoint用のアドイン。