opensslユーティリティが複数のダイジェストコマンドを受け付けないのは残念です。複数のファイルで同じコマンドを実行するのがより一般的な使用パターンだと思います。私のシステム(Mepis 11)のopensslユーティリティのバージョンであるFWIWには、shaとsha1のコマンドしかありません。他のshaバリアントはありません。しかし、私はsha256sumと呼ばれるプログラムとmd5sumを持っています。
以下に、単純なPythonプログラムdual_hash.pyを示します。64kのブロックサイズは、私のマシン(2GのRAMを搭載したIntel Pentium 4 2.00GHz)、YMMVに最適なようです。小さなファイルの場合、その速度は、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))
作品のほとんどはhashlibモジュールによって行われているので、私は、あまりない、このプログラムのC / C ++のバージョンが少し速くなりますと仮定される C(またはC ++)で記述されました。また、前述のように、大きなファイルのボトルネックはIO速度です。
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done