Sous l'hypothèse selon laquelle le disque I/O et GRATUIT RAM est-il un goulot d'étranglement (tandis que le temps de la CPU n'est pas la limitation), un outil existe-t-il pouvant calculer plusieurs digests de message à une fois?
Je suis particulièrement intéressé par le calcul des digestions MD-5 et SHA-256 de grands fichiers (taille en gigaoctets), de préférence en parallèle. J'ai essayé openssl dgst -sha256 -md5
, mais cela ne calcule que le hasch en utilisant un 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()
Découvrez pee
("tee standard input to pipes
") de moreutils
. Ceci est essentiellement équivalent à la commande de Marco tee
, mais un peu plus simple à taper.
$ echo foo | pee md5sum sha256sum
d3b07384d113edec49eaa6238ad5ff00 -
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c -
$ pee md5sum sha256sum <foo.iso
f109ffd6612e36e0fc1597eda65e9cf0 -
469a38cb785f8d47a0f85f968feff0be1d6f9398e353496ff7aa9055725bc63e -
Vous pouvez utiliser une boucle for
pour boucler sur les fichiers individuels, puis utiliser tee
combiné à la substitution de processus (fonctionne dans BASH et ZSH, entre autres) à la pipe à différents checksummers.
Exemple:
for file in *.mkv; do
tee < "$file" >(sha256sum) | md5sum
done
Vous pouvez également utiliser plus de deux checksummers:
for file in *.mkv; do
tee < "$file" >(sha256sum) >(sha384sum) | md5sum
done
Cela présente l'inconvénient que les checksummers ne connaissent pas le nom du fichier, car il est passé en entrée standard. Si ce n'est pas acceptable, vous devez émettre les noms de fichiers manuellement. Exemple complet:
for file in *.mkv; do
echo "$file"
tee < "$file" >(sha256sum) >(sha384sum) | md5sum
echo
done > hashfilelist
Vous pouvez toujours utiliser quelque chose comme GNU parallèle :
echo "/path/to/file" | parallel 'md5sum {} & sha256sum {}'
Alternativement, il suffit de courir l'un des deux en arrière-plan:
md5sum /path/to/file & sha256sum /path/to/file
Ou sauvegardez la sortie sur différents fichiers et exécutez plusieurs travaux en arrière-plan:
for file in *; do
md5sum "$file" > "$file".md5 &
sha256sum "$file" > "$file".sha &
done
Qui va lancer autant de md5sum
et sha256sum
Instances que vous avez des fichiers et ils seront tous exécutés en parallèle, enregistrant leur sortie aux noms de fichiers correspondants. Soyez prudent cependant, cela peut devenir lourd si vous avez de nombreux fichiers.
En dehors de la curiosité si un script multi-threaded Python réduirait la durée de fonctionnement, j'ai créé ceci digest.py
script qui utilise threading.Thread
, threading.Queue
et hashlib
pour calculer les hachages pour plusieurs fichiers.
La mise en oeuvre multi-threaded Python==== est effectivement légèrement plus rapide que d'utiliser pee
avec Coreutils. Java d'autre part est ... MEH. Les résultats sont disponibles dans ce message de validation :
Pour comparaison, pour un fichier de 2.3 GiB (min/ avg/max/sd secs pour n = 10):
- pEE SHA256SUM MD5SUM <Fichier: 16.5/ 16.9/17.4/.305
- python3 digest.py -sha256 -md5 <fichier: 13.7/ 15.0/18.7/1.77
- python2 digest.py -sha256 -md5 <fichier: 13.7/ 15.9/18.7/1.64
- jacksum -a sha256 + md5 -f '#checksum {i} #filename': 32.7/ 37.1/50/6.91
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 (à comparaison, pee
a également été ajoutée):
$ ./digest.py -sha256 -md5 digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2 digest.py
b575edf6387888a68c93bf89291f611c digest.py
$ ./digest.py -sha256 -md5 <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2 -
b575edf6387888a68c93bf89291f611c -
$ pee sha256sum md5sum <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2 -
b575edf6387888a68c93bf89291f611c -
Jacksum est un utilitaire indépendant gratuit et indépendant pour l'informatique et la vérification de la somme de contrôle, des CRC et des haubans (Message Digests) ainsi que des horodatés de fichiers. (Extrait de page Jacksum Man )
Il est conscient de fichiers volumineux, il peut traiter des fichiers jusqu'à 8 exabytes (= 8 000 000 000 gigaoctets), présupposé votre système d'exploitation respectivement votre système de fichiers est également au courant. (extrait de - http://www.jonelo.de/java/jacksum/ )
Exemple d'utilisation:
jacksum -a md5+sha256 -F "#ALGONAME{i} (#FILENAME) = #CHECKSUM{i}" jacksum-testfile
Sortie d'échantillon:
md5 (jacksum-testfile) = d41d8cd98f00b204e9800998ecf8427e
sha256 (jacksum-testfile) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Sur Ubuntu, exécutez la commande apt-get install jacksum
pour l'obtenir.
Alternativement, les codes source sont disponibles à