379

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

もしそうなら、私は暗号化の経験があまりないので、いくつかのコードサンプルをいただければ幸いです。

4

7 に答える 7

875

System.Security.Cryptography.MD5を使用すると非常に簡単です。

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

実際に使用されているMD5実装は破棄する必要はないと思いますが、とにかく破棄する可能性があります。)

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

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

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();
        }
    }
}
于 2012-05-09T16:19:09.107 に答える
74

これが私のやり方です:

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));
        }
    }
}
于 2016-01-08T00:09:32.703 に答える
10

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

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();
}

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

于 2016-12-21T19:16:14.343 に答える
3

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

byte[] ComputeHash(string filePath)
{
    using (var md5 = MD5.Create())
    {
        return md5.ComputeHash(File.ReadAllBytes(filePath));
    }
}
于 2014-12-15T10:03:06.017 に答える
3

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

組み込みの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);
        }
    }
于 2019-03-16T13:45:10.833 に答える
2

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

于 2017-04-25T00:45:06.083 に答える
0

動的に生成されたPDFの場合。作成日と変更日は常に異なります。

それらを削除するか、一定の値に設定する必要があります。

次に、ハッシュを比較するためにmd5ハッシュを生成します。

PDFStamper日付を削除または更新するために使用できます。

于 2021-04-01T14:24:01.657 に答える