Je veux que python lise l'EOF afin que je puisse obtenir un hachage approprié, que ce soit sha1 ou md5. Veuillez aider. Voici ce que j'ai jusqu'à présent:
import hashlib
inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()
md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()
sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()
print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed
file.read()
fait - lire le fichier entier.read()
méthode dit?Réponses:
TL; DR utilise des tampons pour ne pas utiliser des tonnes de mémoire.
Nous arrivons au cœur de votre problème, je crois, lorsque nous considérons les implications mémoire du travail avec de très gros fichiers . Nous ne voulons pas que ce mauvais garçon produise 2 Go de RAM pour un fichier de 2 Go , donc, comme le souligne pasztorpisti , nous devons traiter ces fichiers plus gros par morceaux!
Ce que nous avons fait, c'est que nous mettons à jour nos hachages de ce mauvais garçon en morceaux de 64 Ko au fur et à mesure que nous suivons la méthode pratique de mise à jour dandy de hashlib . De cette façon, nous utilisons beaucoup moins de mémoire que les 2 Go qu'il faudrait pour hacher le gars en même temps!
Vous pouvez tester cela avec:
J'espère que cela pourra aider!
Tout cela est également décrit dans la question liée sur le côté droit: Obtenez le hachage MD5 de gros fichiers en Python
Addenda!
En général, lors de l'écriture de python, il est utile de prendre l'habitude de suivre pep-8 . Par exemple, en python, les variables sont généralement séparées par des traits de soulignement et non par camelCased. Mais ce n'est que du style et personne ne se soucie vraiment de ces choses, sauf les gens qui doivent lire le mauvais style ... ce qui pourrait être vous en lisant ce code dans des années.
la source
BUF_SIZE
?shasum
binaires. L'autre réponse répertoriée ci-dessous (celle utilisant memoryview) est compatible avec d'autres outils de hachage.Pour le calcul correct et efficace de la valeur de hachage d'un fichier (en Python 3):
'b'
à- au mode fichier) pour éviter les problèmes de codage de caractères et de conversion de fin de ligne.readinto()
pour éviter le barattage du tampon.Exemple:
la source
resource.getpagesize
il utile ici, si nous voulions essayer de l'optimiser quelque peu dynamiquement? Et qu'en est-ilmmap
?Je proposerais simplement:
Toutes les autres réponses ici semblent trop compliquer. Python met déjà en mémoire tampon lors de la lecture (de manière idéale, ou vous configurez cette mise en mémoire tampon si vous avez plus d'informations sur le stockage sous-jacent) et il est donc préférable de lire par morceaux que la fonction de hachage trouve idéale, ce qui la rend plus rapide ou au moins moins gourmande en CPU pour calculer la fonction de hachage. Ainsi, au lieu de désactiver la mise en mémoire tampon et d'essayer de l'émuler vous-même, vous utilisez la mise en mémoire tampon Python et contrôlez ce que vous devriez contrôler: ce que le consommateur de vos données trouve idéal, la taille du bloc de hachage.
la source
hash.block_size
est documentée comme la «taille de bloc interne de l'algorithme de hachage». Hashlib ne le trouve pas idéal . Rien dans la documentation du package ne suggère deupdate()
préférerhash.block_size
une entrée de taille. Il n'utilise pas moins de CPU si vous l'appelez comme ça. Votrefile.read()
appel entraîne de nombreuses créations d'objets inutiles et des copies superflues du tampon de fichier vers votre nouvel objet octets de bloc.block_size
blocs. Si vous ne les fournissez pas dans ces morceaux, ils doivent mettre en mémoire tampon et attendre que suffisamment de données apparaissent, ou diviser les données données en morceaux en interne. Ainsi, vous pouvez simplement gérer cela de l'extérieur, puis simplifier ce qui se passe en interne. Je trouve cet idéal. Voir par exemple: stackoverflow.com/a/51335622/252025block_size
est beaucoup plus petit que toute taille de lecture utile. De plus, tous les blocs et tailles de lecture utiles sont des puissances de deux. Ainsi, la taille de lecture est divisible par la taille de bloc pour toutes les lectures sauf éventuellement la dernière. Par exemple, la taille du bloc sha256 est de 64 octets. Cela signifie qu'ilupdate()
est capable de traiter directement l'entrée sans aucune mise en mémoire tampon jusqu'à un multiple deblock_size
. Ainsi, seulement si la dernière lecture n'est pas divisible par la taille du bloc, elle doit mettre en mémoire tampon jusqu'à 63 octets, une fois. Par conséquent, votre dernier commentaire est incorrect et ne soutient pas les affirmations que vous faites dans votre réponse.J'ai programmé un module capable de hacher de gros fichiers avec différents algorithmes.
Utilisez le module comme ceci:
la source
Voici une solution Python 3, POSIX (pas Windows!) Qui utilise
mmap
pour mapper l'objet en mémoire.la source
la source
echo $USER_INPUT | md5sum > encrypted.txt && cat encrypted.txt
qui ne traite pas le hachage de fichiers, surtout pas les gros fichiers.