Жаль, что утилита openssl не принимает несколько команд дайджеста; Я предполагаю, что выполнение одной и той же команды для нескольких файлов - более распространенный способ использования. FWIW, версия утилиты openssl в моей системе (Mepis 11) имеет только команды для sha и sha1, но не какие-либо другие варианты sha. Но у меня есть программа sha256sum, а также md5sum.
Вот простая программа на Python, dual_hash.py, которая делает то, что вы хотите. Размер блока в 64 Кб, по-видимому, является оптимальным для моей машины (Intel Pentium 4 2,00 ГГц с 2 ГБ оперативной памяти), YMMV. Для небольших файлов его скорость примерно такая же, как при последовательном запуске md5sum и sha256sum. Но для больших файлов это значительно быстрее. Например, для файла размером 1967063040 байт (образ диска с SD-картой, полной файлов mp3), md5sum + sha256sum занимает около 1m44,9 с, dual_hash.py занимает 1 м 0,332 с.
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))
Я полагаю , версия С / С ++ этой программы будет немного быстрее, но не так много, так как большая часть работы делается модулем hashlib, который будет написан на C (или C ++). И, как вы заметили выше, узким местом для больших файлов является скорость ввода-вывода.
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done