SSブログ

大きなファイルのSHA1計算 [技術]

大きなファイルのハッシュ値を計算する際に、処理が停止してしまうのを避けるため、

SHA1Managedには、便利なメソッドが存在します。

TransformBlock()とTransformFinalBlock()を使ってあげて、while文で回している最中にReportProgressでもすれば、途中経過処理が可能です。


以下では、SHA1を返すメソッドを作成しました。


/// <summary>
/// SHA1を返す
/// </summary>
/// <param name="strFileName">計算したいファイル名</param>
/// <param name="strSHA1">SHA1の16進数文字列</param>
/// <param name="strErrMessage">エラーメッセージ</param>
/// <returns>成功なtrue</returns>
private Boolean SHA1Calc(string strFileName, ref string strSHA1,ref string strErrMessage )
{
  FileStream fs;
  byte[] inputArray;
  SHA1Managed sha1M;
  Int32 count;

  try
  {
    //初期化
    fs = new FileStream(strFileName, FileMode.Open);
    inputArray = new byte[4 * 1024];
    sha1M = new SHA1Managed();

    //ファイルをバイト列として読み込み
    while (fs.Position + inputArray.Length < fs.Length)
    {
      fs.Read(inputArray, 0, inputArray.Length);
      sha1M.TransformBlock(inputArray, 0, inputArray.Length, inputArray, 0);
    }
    count = (Int32)(fs.Length - fs.Position);
    fs.Read(inputArray, 0, count);

    //最後までファイルを読み込む
    sha1M.TransformFinalBlock(inputArray, 0, count);

    //文字列として格納
    strSHA1 = BitConverter.ToString(sha1M.Hash).Replace("-", "");
  }
  catch (FileNotFoundException ex)
  {
    strErrMessage = ex.Message;
    return false;
  }
  catch (FileLoadException ex)
  {
    strErrMessage = ex.Message;
    return false;
  }
  catch (Exception ex)
  {
    strErrMessage = "エラー:" + ex.Message;
    return false;
  }
  return true;
}

コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

SQLiteのINTEGER PRIMA..IE8正式版 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。