เป็นเรื่องน่าเสียดายที่ยูทิลิตี้ openssl ไม่ยอมรับคำสั่งย่อยหลายคำสั่ง ฉันเดาว่าการใช้คำสั่งเดียวกันกับไฟล์หลาย ๆ ไฟล์เป็นรูปแบบการใช้งานทั่วไปที่มากขึ้น FWIW เวอร์ชันของยูทิลิตี openssl บนระบบของฉัน (Mepis 11) มีคำสั่งสำหรับ sha และ sha1 เท่านั้นไม่ใช่ตัวแปร sha อื่น ๆ แต่ฉันมีโปรแกรมที่เรียกว่า sha256sum เช่นเดียวกับ md5sum
นี่คือโปรแกรม Python แบบง่าย ๆ dual_hash.py ซึ่งเป็นสิ่งที่คุณต้องการ ขนาดบล็อก 64k ดูเหมือนจะเหมาะสมที่สุดสำหรับเครื่องของฉัน (Intel Pentium 4 2.00GHz พร้อม RAM 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))
ฉันคิดว่า C / C ++ รุ่นของโปรแกรมนี้จะเป็นเล็ก ๆ น้อย ๆ ได้เร็วขึ้น แต่ไม่มากเนื่องจากส่วนใหญ่ของการทำงานจะถูกดำเนินการโดยโมดูล hashlib ซึ่งถูกเขียนใน C (หรือ C ++) และตามที่คุณระบุไว้ข้างต้นคอขวดสำหรับไฟล์ขนาดใหญ่คือความเร็ว IO
               
              
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done