Calcular sum de comprobación MD5 para un archivo

Estoy usando iTextSharp para leer el texto de un archivo PDF. Sin embargo, a veces no puedo extraer texto porque el archivo PDF solo contiene imágenes. Descargo los mismos archivos PDF todos los días, y quiero ver si el PDF ha sido modificado. Si no se puede obtener el texto y la fecha de modificación, ¿la sum de comprobación MD5 es la manera más confiable de saber si el archivo ha cambiado?

Si es así, se apreciarán algunos ejemplos de código, porque no tengo mucha experiencia con la criptografía.

Es muy simple usar System.Security.Cryptography.MD5 :

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

(Creo que en realidad la implementación de MD5 utilizada no necesita ser eliminada, pero de todos modos probablemente lo haga).

Cómo comparas los resultados después depende de ti; puede convertir la matriz de bytes a base64, por ejemplo, o comparar los bytes directamente. (Solo tenga en cuenta que las matrices no anulan Equals . Usar base64 es más fácil de acertar, pero un poco menos eficiente si realmente solo está interesado en comparar los valores hash).

Si necesita representar el hash como una cadena, puede convertirlo a hexadecimal utilizando 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(); } } } 

Así es como lo hago:

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

Sé que esta pregunta ya fue respondida, pero esto es lo que uso:

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

Donde GetHash :

 public static String GetHash(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(); } 

Probablemente no sea la mejor manera, pero puede ser útil.

Aquí hay una versión un poco más simple que encontré. Lee el archivo completo de una vez y solo requiere una única directiva de using .

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

Y si necesita calcular el MD5 para ver si coincide con el MD5 de un blob de Azure, entonces esta pregunta y respuesta de SO podría ser útil: MD5 hash de blob cargado en Azure no coincide con el mismo archivo en la máquina local