大きなファイルの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;
}
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