Saya menggunakan iTextSharp untuk membaca teks dari file PDF. Namun, ada kalanya saya tidak dapat mengekstraksi teks, karena file PDF hanya berisi gambar. Saya mengunduh file PDF yang sama setiap hari, dan saya ingin melihat apakah PDFnya sudah dimodifikasi. Jika tanggal teks dan modifikasi tidak dapat diperoleh, apakah MD5 checksum cara paling andal untuk mengetahui apakah file telah berubah?
Jika ya, beberapa contoh kode akan dihargai, karena saya tidak punya banyak pengalaman dengan kriptografi.
Jawaban:
Ini sangat sederhana menggunakan System.Security.Cryptography.MD5 :
(Saya percaya bahwa sebenarnya implementasi MD5 yang digunakan tidak perlu dibuang, tapi saya mungkin masih akan melakukannya.)
Bagaimana Anda membandingkan hasilnya setelah itu terserah Anda; Anda dapat mengkonversi array byte ke base64 misalnya, atau membandingkan byte secara langsung. (Perlu diketahui bahwa array tidak mengesampingkan
Equals
. Menggunakan base64 lebih mudah untuk dilakukan dengan benar, tetapi sedikit kurang efisien jika Anda benar-benar hanya tertarik membandingkan hash.)Jika Anda perlu merepresentasikan hash sebagai string, Anda bisa mengubahnya menjadi hex menggunakan
BitConverter
:sumber
BitConverter.ToString(md5.ComputeHash(stream)).Replace("-","").ToLower();
.Replace("-", String.Empty)
pendekatan yang lebih baik. Saya melewati sesi debug satu jam karena saya mendapatkan hasil yang salah ketika membandingkan input pengguna ke hash file.Beginilah cara saya melakukannya:
sumber
using
blok akan berguna, karena membuka file lebih mungkin akan gagal. Pendekatan awal / cepat yang gagal menghemat sumber daya yang diperlukan untuk membuat (dan menghancurkan) instance MD5 dalam skenario seperti itu. Anda juga dapat menghilangkan kawat gigi yang pertamausing
dan menyimpan tingkat indentasi tanpa kehilangan keterbacaan.Saya tahu pertanyaan ini sudah dijawab, tetapi inilah yang saya gunakan:
Di mana GetHash :
Mungkin bukan cara terbaik, tetapi bisa berguna.
sumber
public static String GetHash<T>(this Stream stream) where T : HashAlgorithm, new() { StringBuilder sb = new StringBuilder(); using (T crypt = new T()) { byte[] hashBytes = crypt.ComputeHash(stream); foreach (byte bt in hashBytes) { sb.Append(bt.ToString("x2")); } } return sb.ToString(); }
Ini adalah versi yang sedikit lebih sederhana yang saya temukan. Bunyinya seluruh file dalam sekali jalan dan hanya membutuhkan
using
arahan tunggal .sumber
ReadAllBytes
adalah bahwa memuat seluruh file ke dalam satu array. Itu tidak berfungsi sama sekali untuk file yang lebih besar dari 2 GiB dan memberikan banyak tekanan pada GC bahkan untuk file berukuran sedang. Jawaban Jon hanya sedikit lebih kompleks, tetapi tidak menderita dari masalah ini. Jadi saya lebih suka jawabannya daripada jawaban Anda.using
s setelah satu sama lain tanpa kurung kurawal pertamausing (var md5 = MD5.Create()) using (var stream = File.OpenRead(filename))
memberi Anda satu menggunakan per baris tanpa lekukan yang tidak perlu.using
arahan." sebenarnya bukan alasan yang bagus untuk membaca semuanya dalam ingatan. Pendekatan yang lebih efektif adalah mengalirkan data ke dalamComputeHash
, dan jika mungkinusing
hanya boleh digunakan, tapi saya benar-benar bisa mengerti jika Anda ingin menghindari tingkat lekukan ekstra.Saya tahu bahwa saya terlambat ke pesta tetapi melakukan tes sebelum benar-benar menerapkan solusi.
Saya melakukan tes terhadap kelas MD5 inbuilt dan juga md5sum.exe . Dalam kasus saya kelas inbuilt mengambil 13 detik di mana md5sum.exe juga sekitar 16-18 detik dalam setiap proses.
sumber
Dan jika Anda perlu menghitung MD5 untuk melihat apakah cocok dengan MD5 dari gumpalan Azure, maka pertanyaan dan jawaban SO ini mungkin bisa membantu: G hash MD5 yang diunggah di Azure tidak cocok dengan file yang sama pada mesin lokal
sumber