web-dev-qa-db-ja.com

ファイルのMD5チェックサムを計算する

私は iTextSharp を使ってPDFファイルからテキストを読みます。ただし、PDFファイルには画像しか含まれていないため、テキストを抽出できないことがあります。毎日同じPDFファイルをダウンロードしていますが、PDFが変更されていないか確認したいと思います。テキストと修正日を取得できない場合、 MD5 checksumがファイルが変更されたかどうかを判断する最も信頼できる方法ですか?

もしそうなら、私は暗号化の経験があまりないので、いくつかのコードサンプルが評価されるでしょう。

297
broke

System.Security.Cryptography.MD5 を使うのはとても簡単です。

using (var md5 = MD5.Create())
{
    using (var stream = File.OpenRead(filename))
    {
        return md5.ComputeHash(stream);
    }
}

(私は 実際に 使用されているMD5の実装を破棄する必要はないと思いますが、それでもやはりそうするでしょう。)

後で結果を比較する方法はあなた次第です。たとえば、バイト配列をbase64に変換したり、バイトを直接比較したりできます。 (配列はEqualsをオーバーライドしないことに注意してください。base64を使用する方が簡単ですが、ハッシュを比較することだけに関心がある場合はやや効率が低下します。)

ハッシュを文字列として表現する必要がある場合は、BitConverterを使用してそれを16進数に変換できます。

static string CalculateMD5(string filename)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            var hash = md5.ComputeHash(stream);
            return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
        }
    }
}
678
Jon Skeet

これが私のやり方です。

using System.IO;
using System.Security.Cryptography;

public string checkMD5(string filename)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            return Encoding.Default.GetString(md5.ComputeHash(stream));
        }
    }
}
62
BoliBerrys

私はこの質問がすでに答えられているのを知っています、しかしこれは私が使うものです:

using (FileStream fStream = File.OpenRead(filename)) {
    return GetHash<MD5>(fStream)
}

ここで GetHash

public static String GetHash<T>(Stream stream) where T : HashAlgorithm {
    StringBuilder sb = new StringBuilder();

    MethodInfo create = typeof(T).GetMethod("Create", new Type[] {});
    using (T crypt = (T) create.Invoke(null, null)) {
        byte[] hashBytes = crypt.ComputeHash(stream);
        foreach (byte bt in hashBytes) {
            sb.Append(bt.ToString("x2"));
        }
    }
    return sb.ToString();
}

おそらく最善の方法ではありませんが、それは便利です。

7
Badaro Jr.

また、MD5を計算してAzure BLOBのMD5と一致するかどうかを確認する必要がある場合は、このSOの質問と回答が役に立ちます。 AzureにアップロードされたBLOBのMD5ハッシュはローカルの同じファイルと一致しません)機械

3
Manfred

これは私が見つけた少し簡単なバージョンです。ファイル全体を一度に読み込むので、必要なのはusingディレクティブが1つだけです。

byte[] ComputeHash(string filePath)
{
    using (var md5 = MD5.Create())
    {
        return md5.ComputeHash(File.ReadAllBytes(filePath));
    }
}
3
Ashley Davis

私はパーティーに遅刻していますが、実際にソリューションを実装する前にテストを実行しました。

作り付けのMD5クラスと md5sum.exe に対してテストを行いました。私の場合、作り付けのクラスは13秒かかり、md5sum.exeも毎回16〜18秒かかります。

    DateTime current = DateTime.Now;
    string file = @"C:\text.iso";//It's 2.5 Gb file
    string output;
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(file))
        {
            byte[] checksum = md5.ComputeHash(stream);
            output = BitConverter.ToString(checksum).Replace("-", String.Empty).ToLower();
            Console.WriteLine("Total seconds : " + (DateTime.Now - current).TotalSeconds.ToString() + " " + output);
        }
    }
0