Thật đáng tiếc khi tiện ích openssl không chấp nhận nhiều lệnh digest; Tôi đoán thực hiện cùng một lệnh trên nhiều tệp là một mẫu sử dụng phổ biến hơn. FWIW, phiên bản của tiện ích openssl trên hệ thống của tôi (Mepis 11) chỉ có các lệnh cho sha và sha1, không có bất kỳ biến thể sha nào khác. Nhưng tôi có một chương trình gọi là sha256sum, cũng như md5sum.
Đây là một chương trình Python đơn giản, dual_hash.py, thực hiện những gì bạn muốn. Kích thước khối 64k dường như là tối ưu cho máy của tôi (Intel Pentium 4 2.00GHz với 2G RAM), YMMV. Đối với các tệp nhỏ, tốc độ của nó gần tương đương với việc chạy md5sum và sha256sum liên tiếp. Nhưng đối với các tệp lớn hơn thì nhanh hơn đáng kể. Ví dụ: trên tệp byte 1967063040 (hình ảnh đĩa của thẻ SD chứa đầy tệp mp3), md5sum + sha256sum mất khoảng 1m44.9s, dual_hash.py mất 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))
Tôi cho rằng một phiên bản C / C ++ của chương trình này sẽ nhanh hơn một chút, nhưng không nhiều, vì hầu hết các công việc đang được thực hiện bởi mô-đun hashlib, được viết bằng C (hoặc C ++). Và như bạn đã lưu ý ở trên, nút cổ chai cho các tệp lớn là tốc độ IO.
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done