Жаль, что утилита openssl не принимает несколько команд дайджеста; думаю, выполнение одной и той же команды на нескольких файлах - более распространенный шаблон использования. FWIW, версия утилиты openssl на моей системе (Mepis 11) имеет команды только для sha и sha1, а не для любого другого варианта sha. Но у меня есть программа под названием sha256sum, а также md5sum.
Вот простая программа Python, dual_hash.py, которая делает то, что вы хотите. Блок размером 64k кажется оптимальным для моей машины (Intel Pentium 4 2.00GHz с 2G оперативной памяти), YMMV. Для небольших файлов его скорость примерно такая же, как при последовательном запуске md5sum и sha256sum. Но для больших файлов она значительно быстрее. Например, на файле 1967063040 байт (образ диска SD карты, полной mp3 файлов), md5sum + sha256sum занимает около 1m44.9s, dual_hash.py - 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))
Полагаю, версия этой программы на С/С++ будет немного быстрее, но не намного, так как большая часть работы выполняется модулем хэшлиба, который это , написанный на С (или С++). И, как Вы отметили выше, узким местом для больших файлов является скорость ввода-вывода.