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
#! /usr/bin/env python
''' Calculate MD5 and SHA-256 digests of a file simultaneously
Written by PM 2Ring 2014.10.23
'''
import sys
import hashlib
def digests(fname, blocksize):
md5 = hashlib.md5()
sha = hashlib.sha256()
with open(fname, 'rb') as f:
while True:
block = f.read(blocksize)
if not block:
break
md5.update(block)
sha.update(block)
print("md5: %s" % md5.hexdigest())
print("sha256: %s" % sha.hexdigest())
def main(*argv):
blocksize = 1<<16 # 64kB
if len(argv) < 2:
print("No filename given!\n")
print("Calculate md5 and sha-256 message digests of a file.")
print("Usage:\npython %s filename [blocksize]\n" % sys.argv[0])
print("Default blocksize=%d" % blocksize)
return 1
fname = argv[1]
if len(argv) > 2:
blocksize = int(sys.argv[2])
print("Calculating MD5 and SHA-256 digests of %r using a blocksize of %d" % (fname, blocksize))
digests(fname, blocksize)
if __name__ == '__main__':
sys.exit(main(*sys.argv))
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.
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done