Maison  >  Article  >  développement back-end  >  Comment calculer efficacement le hachage MD5 de fichiers volumineux en Python ?

Comment calculer efficacement le hachage MD5 de fichiers volumineux en Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-20 11:29:30197parcourir

How to Calculate MD5 Hash of Large Files in Python Efficiently?

Calcul du hachage MD5 de fichiers volumineux en Python

Lorsque vous travaillez avec des fichiers extrêmement volumineux, les méthodes traditionnelles de calcul des hachages MD5 à l'aide de la bibliothèque hashlib deviennent peu pratiques car ils nécessitent de charger l’intégralité du fichier en mémoire. Cette approche peut épuiser les ressources du système, entraînant des erreurs et des ralentissements.

Solution : hachage fragmenté

Pour résoudre ce problème, une technique appelée hachage fragmenté peut être utilisée pour calculer Hachage MD5 de manière incrémentielle sans charger l'intégralité du fichier en mémoire. Cela implique :

  1. Diviser le fichier en morceaux plus petits d'une taille gérable (par exemple, 1 Mo).
  2. Calcul du hachage MD5 de chaque morceau à l'aide de hashlib.md5().
  3. Concaténation des morceaux hachés pour obtenir le hachage MD5 final.

Implémentation du code :

La fonction Python suivante md5_for_file() implémente le hachage fragmenté :

<code class="python">def md5_for_file(f, block_size=2**20):
    md5 = hashlib.md5()
    while True:
        data = f.read(block_size)
        if not data:
            break
        md5.update(data)
    return md5.digest()</code>

Pour utiliser cette fonction, assurez-vous d'ouvrir le fichier en mode binaire (rb).

Méthode complète :

Pour plus de commodité, voici une méthode complète generate_file_md5() qui combine le hachage fragmenté et l'ouverture de fichier en une seule étape :

<code class="python">def generate_file_md5(rootdir, filename, blocksize=2**20):
    m = hashlib.md5()
    with open(os.path.join(rootdir, filename), "rb") as f:
        while True:
            buf = f.read(blocksize)
            if not buf:
                break
            m.update(buf)
    return m.hexdigest()</code>

Cette méthode renvoie le hachage MD5 codé en hexadécimal du fichier spécifié sous forme de chaîne. Vous pouvez vérifier les résultats à l'aide d'outils externes comme Jacksum à des fins de comparaison.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn