Sangat disayangkan bahwa utilitas openssl tidak menerima banyak perintah digest; Saya kira melakukan perintah yang sama pada banyak file adalah pola penggunaan yang lebih umum. FWIW, versi utilitas openssl pada sistem saya (Mepis 11) hanya memiliki perintah untuk sha dan sha1, bukan salah satu dari varian sha lainnya. Tapi saya punya program yang disebut sha256sum, serta md5sum.
Berikut adalah program Python sederhana, dual_hash.py, yang melakukan apa yang Anda inginkan. Ukuran blok 64k tampaknya optimal untuk mesin saya (Intel Pentium 4 2.00GHz dengan 2G RAM), YMMV. Untuk file kecil, kecepatannya kira-kira sama dengan menjalankan md5sum dan sha256sum secara berurutan. Tetapi untuk file yang lebih besar, ini jauh lebih cepat. Misalnya, pada file byte 1967063040 (gambar disk kartu SD yang penuh dengan file mp3), md5sum + sha256sum memakan waktu sekitar 1m44.9s, dual_hash.py membutuhkan waktu 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))
Saya kira C / C ++ versi program ini akan menjadi sedikit lebih cepat, tapi tidak banyak, karena sebagian besar pekerjaan yang dilakukan oleh modul hashlib, yang adalah ditulis dalam C (atau C ++). Dan seperti yang Anda sebutkan di atas, hambatan untuk file besar adalah kecepatan IO.
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done