Es una pena que la utilidad openssl no acepte múltiples comandos de resumen; Supongo que ejecutar el mismo comando en varios archivos es un patrón de uso más común. FWIW, la versión de la utilidad openssl en mi sistema (Mepis 11) solo tiene comandos para sha y sha1, no ninguna de las otras variantes de sha. Pero tengo un programa llamado sha256sum, así como md5sum.
Aquí hay un programa simple de Python, dual_hash.py, que hace lo que quieres. Un tamaño de bloque de 64k parece ser óptimo para mi máquina (Intel Pentium 4 2.00GHz con 2G de RAM), YMMV. Para archivos pequeños, su velocidad es aproximadamente la misma que ejecutar md5sum y sha256sum en sucesión. Pero para archivos más grandes es significativamente más rápido. Por ejemplo, en un archivo de bytes de 1967063040 (una imagen de disco de una tarjeta SD llena de archivos mp3), md5sum + sha256sum toma alrededor de 1m44.9s, dual_hash.py toma 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))
Supongo que una versión C / C ++ de este programa sería un poco más rápida, pero no mucho, ya que la mayoría del trabajo lo realiza el módulo hashlib, que está escrito en C (o C ++). Y como notó anteriormente, el cuello de botella para archivos grandes es la velocidad de E / S.
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done