web-dev-qa-db-fra.com

Calculer simultanément plusieurs digests (MD5, SHA256)?

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()
25
Lekensteyn

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  -
28
Matt Nordhoff

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
10
Marco

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.

5
terdon

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  -
3
Lekensteyn

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 à

1
pallxk