Openssl yardımcı programının birden fazla özet komutunu kabul etmemesi üzücü; Sanırım aynı komutu birden fazla dosyada yapmak daha yaygın bir kullanım şeklidir. FWIW, sistemimdeki openssl yardımcı programının sürümü (Mepis 11), diğer sha değişkenlerinden hiçbirinde değil, sadece sha ve sha1 komutlarını içerir. Ancak sha256sum ve md5sum adında bir programım var.
İşte istediğini yapan basit bir Python programı, dual_hash.py. Benim makine için 64k'lık bir blok büyüklüğü en uygun gibi görünüyor (2G RAM ile Intel Pentium 4 2.00GHz), YMMV. Küçük dosyalar için hızı, md5sum ve sha256sum'ları art arda çalıştırmakla hemen hemen aynıdır. Ancak daha büyük dosyalar için çok daha hızlıdır. Örneğin, 1967063040 bayt bir dosyada (mp3 dosyalarıyla dolu bir SD kartın bir disk görüntüsü), md5sum + sha256sum yaklaşık 1m44.9s, dual_hash.py ise 1m0.312s alır.
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))
Sanırım bu programın C / C ++ sürümü biraz daha hızlı olacaktı ama çok fazla değil, çünkü işlerin çoğu C (veya C ++) ile yazılmış hashlib modülü tarafından yapılıyor . Yukarıda belirttiğiniz gibi, büyük dosyalar için tıkanıklık IO hızıdır.
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done