openssl 유틸리티가 여러 다이제스트 명령을 허용하지 않는 것이 유감입니다. 여러 파일에서 동일한 명령을 수행하는 것이 더 일반적인 사용 패턴이라고 생각합니다. FWIW, 내 시스템 (Mepis 11)의 openssl 유틸리티 버전에는 다른 sha 변형이 아닌 sha 및 sha1에 대한 명령 만 있습니다. 그러나 md5sum뿐만 아니라 sha256sum이라는 프로그램이 있습니다.
다음은 원하는 것을 수행하는 간단한 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))
이 프로그램의 C / C ++ 버전은 조금 더 빠른 것 생각하지만,별로, 대부분의 작업이 hashlib 모듈에 의해 수행되고 있기 때문에 되어 C (또는 C ++)로 작성. 위에서 언급했듯이 큰 파일의 병목 현상은 IO 속도입니다.
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done