Calculer MD5 checksum pour un fichier

j'utilise iTextSharp pour lire le texte d'un fichier PDF. Cependant, il y a des fois où je ne peux pas extraire de texte, parce que le fichier PDF ne contient que des images. Je télécharge les mêmes fichiers PDF tous les jours, et je veux voir si le PDF a été modifié. Si le texte et la date de modification ne peuvent pas être obtenus, est-ce qu'une somme de contrôle de MD5 est la façon la plus fiable de dire si le fichier a changé?

si c'est le cas, certains échantillons de code seraient apprécié, parce que je n'ai pas beaucoup d'expérience avec la cryptographie.

269
demandé sur CodesInChaos 2012-05-09 20:16:51

5 réponses

c'est très simple en utilisant le système .Sécurité.Cryptographie.MD5 :

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

(je crois que le en fait le MD5 de mise en œuvre utilisées ne doit pas être éliminés, mais je serais probablement encore le faire de toute façon.)

c'est à vous de comparer les résultats après coup; vous pouvez convertir le tableau d'octets en base64 par exemple, ou comparer les octets directement. (Juste être conscient que les tableaux n'outrepassent pas Equals . L'utilisation de base64 est plus simple pour obtenir le droit, mais légèrement moins efficace si vous êtes vraiment seulement intéressé à comparer les hachures.)

si vous avez besoin de représenter le hachage comme une chaîne, vous pouvez le convertir en hex en utilisant 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();
        }
    }
}
619
répondu Jon Skeet 2017-10-16 12:52:42

C'est comment je le fais:

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));
        }
    }
}
56
répondu BoliBerrys 2017-03-28 15:27:25

je sais que cette question a déjà été répondue, mais c'est ce que j'utilise:

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

Probablement pas la meilleure façon, mais il peut être pratique.

5
répondu Badaro Jr. 2016-12-21 19:16:14

Voici une version un peu plus simple que j'ai trouvé. Il lit le fichier entier en une seule fois et ne nécessite qu'une seule directive using .

byte[] ComputeHash(string filePath)
{
    using (var md5 = MD5.Create())
    {
        return md5.ComputeHash(File.ReadAllBytes(filePath));
    }
}
2
répondu Ashley Davis 2017-03-28 15:26:45

et si vous avez besoin de calculer le MD5 pour voir si elle correspond à la MD5 D'un blob D'Azur, alors cette question et réponse pourrait être utile: hash MD5 de blob téléchargé sur L'Azur ne correspond pas avec le même fichier sur la machine locale

2
répondu Manfred 2017-05-23 12:10:46