これは私の最初の C# プロジェクトであり、ほぼ初心者です。ファイルの選択には openfiledialoge を使用し、GetFullPath メソッドでファイルパスを取得して、たとえば fpath という変数に格納します。そのパスが fpath 変数に格納されているファイルのハッシュを計算する必要があります.GetHashCodeを介して実行できると思います。スニペットまたは簡単なガイドを教えてもらえますか?
4 に答える
using (FileStream stream = File.OpenRead(file))
{
SHA256Managed sha = new SHA256Managed();
byte[] hash = sha.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", String.Empty);
}
SOに関する別の質問に回答するために使用したコードを次に示します
/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(string filePath)
{
using (var sha1 = new SHA1CryptoServiceProvider())
return GetHash(filePath, sha1);
}
/// <summary>
/// Gets a hash of the file using SHA1.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetSHA1Hash(Stream s)
{
using (var sha1 = new SHA1CryptoServiceProvider())
return GetHash(s, sha1);
}
/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(string filePath)
{
using (var md5 = new MD5CryptoServiceProvider())
return GetHash(filePath, md5);
}
/// <summary>
/// Gets a hash of the file using MD5.
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static string GetMD5Hash(Stream s)
{
using (var md5 = new MD5CryptoServiceProvider())
return GetHash(s, md5);
}
private static string GetHash(string filePath, HashAlgorithm hasher)
{
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
return GetHash(fs, hasher);
}
private static string GetHash(Stream s, HashAlgorithm hasher)
{
var hash = hasher.ComputeHash(s);
var hashStr = Convert.ToBase64String(hash);
return hashStr.TrimEnd('=');
}
GetHashCode() は、デフォルトでは内部使用のみで、オブジェクトへの 2 つの参照が実際に同じオブジェクトであるかどうかをチェックします。デフォルトのハッシュ実装はスタック/ヒープの場所に基づいているため、プログラムの実行間で決定論的ではありません (または、まったく同じデータを持つ 2 つの異なる参照を比較することさえありません)。したがって、チェックサムの計算には使用しないでください。
.NET には、この目的に役立つ一連の組み込みライブラリがあります。それらは System.Security.Cryptography 名前空間にあります。必要な 2 つは、MD5 および SHA1 クラスです。
byte[] hashBytes;
using(var inputFileStream = File.Open(filePath))
{
var md5 = MD5.Create();
hashBytes = md5.ComputeHash(inputFileStream);
}
SHA1
クラスは同じように機能します。
注意の言葉; MD5 と SHA1 はどちらも「壊れている」と見なされ、「安全な」ハッシュを必要とするシステムでは使用しないでください。代わりに、システム全体で SHA-256 または SHA-512 アルゴリズムを使用することを検討してください。安全なハッシュが必要ない場合は、FNV-1a や MurmurHash などの高速なチェックサム ハッシュがあり、優れた衝突耐性を提供します。
C# マネージ ライブラリを使用してハッシュを計算する完全なコードを次に示します。
using system.IO;
using System.Security.Cryptography;
public string GetSha1Hash(string filePath)
{
using (FileStream fs = File.OpenRead(filePath))
{
SHA1 sha = new SHA1Managed();
return BitConverter.ToString(sha.ComputeHash(fs));
}
}