遗憾的是,openssl实用程序不接受多个摘要命令。我猜想在多个文件上执行相同的命令是更常见的使用模式。FWIW,我系统上的openssl实用程序版本(Mepis 11)仅具有用于sha和sha1的命令,而没有其他任何sha变体。但是我确实有一个名为sha256sum和md5sum的程序。
这是一个简单的Python程序dual_hash.py,它可以满足您的需求。对于我的机器(Intel Pentium 4 2.00GHz和2G RAM),YMMV似乎是64k的最佳块大小。对于小文件,其速度与连续运行md5sum和sha256sum大致相同。但是对于较大的文件,速度明显更快。例如,在1967063040字节文件(装有mp3文件的SD卡的磁盘映像)上,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