C#でファイルの内容のハッシュを計算する必要がありますか?だから、私は私のアプリで2つのファイルのハッシュを比較することができます。私は検索したが見つかりませんでした。C#でファイルの内容のハッシュを計算する?
9
A
答えて
17
MD5CryptoServiceProvider
は、テキストベースのファイルとバイナリファイルで動作します。
byte[] myFileData = File.ReadAllBytes(myFileName);
byte[] myHash = MD5.Create().ComputeHash(myFileData);
または...あなたは大きなファイルで作業し、メモリにファイル全体をロードしない場合:あなたはEnumerable.SequenceEqual
で二つのファイルからバイト配列に比較することができ
byte[] myHash;
using (var md5 = MD5.Create())
using (var stream = File.OpenRead(myFileName))
myHash = md5.ComputeHash(stream);
:
myHash1.SequenceEqual(myHash2);
また、CRC計算機を作成することもできます。参照してください:http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net
4
あなたがより良い検索すべき;)
using System.IO;
using System.Text;
using System.Security.Cryptography;
protected string GetMD5HashFromFile(string fileName)
{
FileStream file = new FileStream(fileName, FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
このように、この機能にファイルを渡します。
GetMD5HashFromFile("text1.txt");
GetMD5HashFromFile("text2.txt");
+1
実際にバイト配列全体を文字列に変換する必要はありますか?私はちょうど2つのハッシュを比較するためにちょっとした仕事のようだ。 –
+2
'Close()'を明示的に呼び出すのではなく、ストリーム上で 'using'を使うべきです。 – svick
ファイル全体をバイト配列に変換することは本当に必要ですか? – svick
@svick:私は自分の答えを更新しました。入力いただきありがとうございます! –
@MartinMulder、辞書を使ってハッシュを保存し、TryGetValueで比較することはできますか?))ハッシュのハッシュ)) –