Dans l'hypothèse où les E / S disque et la RAM libre sont un goulot d'étranglement (alors que le temps CPU n'est pas la limitation), existe-t-il un outil qui peut calculer plusieurs résumés de messages à la fois?
Je suis particulièrement intéressé par le calcul des synthèses MD-5 et SHA-256 de gros fichiers (taille en gigaoctets), de préférence en parallèle. J'ai essayé openssl dgst -sha256 -md5
, mais il ne calcule le hachage qu'en utilisant un seul algorithme.
Pseudo-code pour le comportement attendu:
for each block:
for each algorithm:
hash_state[algorithm].update(block)
for each algorithm:
print algorithm, hash_state[algorithm].final_hash()
shell-script
hashsum
parallelism
Lekensteyn
la source
la source
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done
for i in file1 file2 …; do tee < "$i" >(sha256sum) | md5sum ; done
Ensuite, vous devez ajouter du code supplémentaire pour marquer le nom du fichier, car il est envoyé en tant qu'entrée standard versmd5sum
etsha256sum
.Réponses:
Consultez
pee
("tee standard input to pipes
") à partir demoreutils
. C'est fondamentalement équivalent à latee
commande de Marco , mais un peu plus simple à taper.la source
pee
a la meilleure interface, une comparaison de temps avec d'autres outils peut être trouvée dans cet article qui montre également un outil Python multi-thread.moreutils
conflits avecGNU parallel
mon système Debian… cependant, il est bon de savoir qu'il existe un tel outil.aptitude
qu'il ne me permet pas d'avoir les deux packages en même temps).moreutils-parallel
nom pour éviter le conflit.Vous pouvez utiliser une
for
boucle pour parcourir les fichiers individuels, puis utiliser unetee
combinaison avec la substitution de processus (fonctionne dans Bash et Zsh, entre autres) pour diriger vers différents vérificateurs.Exemple:
Vous pouvez également utiliser plus de deux checksums:
Cela présente l'inconvénient que les vérificateurs ne connaissent pas le nom du fichier, car il est transmis en tant qu'entrée standard. Si ce n'est pas acceptable, vous devez émettre les noms de fichiers manuellement. Exemple complet:
la source
*sum
famille d'outils, cette expression sed pourrait être utilisée à la place:sed "s;-\$;${file//;/\\;};
(remplacé la fin-
par le nom de fichier, mais assurez-vous que le nom de fichier est correctement échappé).zsh
. Dans ksh93 et bash, la sortie de sha256sum passe à md5sum. Vous aurez envie:{ tee < "$file" >(sha256sum >&3) | md5sum; } 3>&1
. Voir unix.stackexchange.com/q/153896/22565 pour le problème inverse.Il est dommage que l'utilitaire openssl n'accepte pas plusieurs commandes de résumé; Je suppose que l'exécution de la même commande sur plusieurs fichiers est un modèle d'utilisation plus courant. FWIW, la version de l'utilitaire openssl sur mon système (Mepis 11) n'a que des commandes pour sha et sha1, pas pour les autres variantes de sha. Mais j'ai un programme appelé sha256sum, ainsi que md5sum.
Voici un simple programme Python, dual_hash.py, qui fait ce que vous voulez. Une taille de bloc de 64 Ko semble être optimale pour ma machine (Intel Pentium 4 2,00 GHz avec 2 Go de RAM), YMMV. Pour les petits fichiers, sa vitesse est à peu près la même que l'exécution successive de md5sum et sha256sum. Mais pour les fichiers plus volumineux, c'est beaucoup plus rapide. Par exemple, sur un fichier d'octets 1967063040 (une image disque d'une carte SD remplie de fichiers mp3), md5sum + sha256sum prend environ 1m44.9s, dual_hash.py prend 1m0.312s.
dual_hash.py
Je suppose qu'une version C / C ++ de ce programme serait un peu plus rapide, mais pas beaucoup, car la plupart du travail est effectué par le module hashlib, qui est écrit en C (ou C ++). Et comme vous l'avez noté ci-dessus, le goulot d'étranglement pour les gros fichiers est la vitesse d'E / S.
la source
md5sum
etsha256sum
combinée (4.7s + 14.2s vs 18.7s pour ce script Python, fichier en cache; 33.6s pour le run à froid). 64KiB vs 1MiB n'a pas changé la situation. Le code étant commenté, 5,1 s ont été dépensés pour md5 (n = 3), 14,6 s pour sha1 (n = 3). Testé sur un i5-460M avec 8 Go de RAM. Je suppose que cela pourrait encore être amélioré en utilisant plus de threads.digests
ne traite qu'un seul fichier à chaque appel. Donc, même si vous l'avez appelé en boucle, il créera de nouveaux contextes md5 & sha à chaque appel. FWIW, vous pouvez profiter de mon hachage SHA-256 de reprise .Vous pouvez toujours utiliser quelque chose comme GNU parallel :
Alternativement, exécutez simplement l'un des deux en arrière-plan:
Ou, enregistrez la sortie dans différents fichiers et exécutez plusieurs travaux en arrière-plan:
Cela va lancer le plus grand nombre
md5sum
et lessha256sum
instances que vous avez des fichiers et ils fonctionnent tous en parallèle, sauver leur sortie aux noms de fichiers correspondants. Attention cependant, cela peut devenir lourd si vous avez de nombreux fichiers.la source
Sur curiousity si un script Python multi-thread réduirait le temps d' exécution, j'ai créé ce
digest.py
scénario qui usagesthreading.Thread
,threading.Queue
ethashlib
de les calculer pour plusieurs fichiers.L'implémentation Python multi-thread est en effet légèrement plus rapide que l'utilisation
pee
avec coreutils. Java d'autre part est ... meh. Les résultats sont disponibles dans ce message de validation :La sortie de hachage est compatible avec la sortie produite par coreutils. Étant donné que la longueur dépend de l'algorithme de hachage, cet outil ne l'imprime pas. Utilisation (pour comparaison,
pee
a également été ajoutée):la source
pee "openssl sha256" "openssl md5" < file
, mais, honnêtement, je l'ai juste essayé, et il n'a pas battu digest.py. Cela a cependant réduit l'écart.Jacksum est un utilitaire gratuit et indépendant de la plate-forme pour calculer et vérifier les sommes de contrôle, les CRC et les hachages (résumés de messages) ainsi que les horodatages des fichiers. (extrait de la page de manuel jacksum )
Il est sensible aux fichiers volumineux, il peut traiter des tailles de fichiers jusqu'à 8 exaoctets (= 8 000 000 000 gigaoctets), présupposant respectivement votre système d'exploitation, votre système de fichiers est également sensible aux fichiers volumineux. (extrait de http://www.jonelo.de/java/jacksum/ )
Exemple d'utilisation:
Exemple de sortie:
Sur ubuntu, exécutez la commande
apt-get install jacksum
pour l'obtenir.Alternativement, les codes source sont disponibles sur
la source