여러 다이제스트(md5, sha256)를 동시에 계산하시겠습니까?

여러 다이제스트(md5, sha256)를 동시에 계산하시겠습니까?

디스크 I/O와 사용 가능한 RAM이 병목 현상(CPU 시간은 제한이 아님)이라고 가정할 때 여러 메시지 다이제스트를 동시에 계산할 수 있는 도구가 있습니까?

저는 특히 대용량 파일(GB 단위)의 MD-5 및 SHA-256 다이제스트를 병렬로 계산하는 데 관심이 있습니다. 나는 이것을 시도했지만 openssl dgst -sha256 -md5해시 값을 계산하는 데 하나의 알고리즘만 사용합니다.

예상되는 동작에 대한 의사 코드:

for each block:
    for each algorithm:
        hash_state[algorithm].update(block)
for each algorithm:
    print algorithm, hash_state[algorithm].final_hash()

답변1

다음에서 보기 pee(" tee standard input to pipes")moreutils. 이는 기본적으로 Marco의 tee명령과 동일하지만 입력하기가 조금 더 쉽습니다.

$ echo foo | pee md5sum sha256sum
d3b07384d113edec49eaa6238ad5ff00  -
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  -
$ pee md5sum sha256sum <foo.iso
f109ffd6612e36e0fc1597eda65e9cf0  -
469a38cb785f8d47a0f85f968feff0be1d6f9398e353496ff7aa9055725bc63e  -

답변2

for루프를 사용하여 개별 파일을 반복한 다음 tee 프로세스 대체(Bash 및 Zsh 등의 경우)와 결합하여 다른 체크섬으로 파이프할 수 있습니다 .

예:

for file in *.mkv; do
  tee < "$file" >(sha256sum) | md5sum
done

세 개 이상의 체크섬을 사용할 수도 있습니다.

for file in *.mkv; do
  tee < "$file" >(sha256sum) >(sha384sum) | md5sum
done

단점은 체크섬이 표준 입력으로 전달되기 때문에 파일 이름을 알 수 없다는 것입니다. 이것이 허용되지 않으면 파일 이름을 수동으로 발행해야 합니다. 완전한 예:

for file in *.mkv; do
  echo "$file"
  tee < "$file" >(sha256sum) >(sha384sum) | md5sum
  echo
done > hashfilelist

답변3

불행히도 openssl 유틸리티는 여러 다이제스트 명령을 허용하지 않습니다. 여러 파일에 대해 동일한 명령을 실행하는 것이 더 일반적인 사용 패턴인 것 같습니다. FWIW, 내 시스템(Mepis 11)의 openssl 유틸리티 버전에는 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가 걸립니다.

이중 해시.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 속도입니다.

답변4

Python 스크립트의 멀티스레딩이 실행 시간을 단축시킬 수 있을지 궁금해서 이것을 만들었습니다.digest.pythreading.Thread, threading.Queue및 를 사용하여 hashlib여러 파일의 해시를 계산하는 스크립트입니다 .

다중 스레드 Python 구현은 실제로 peecoreutils를 사용하는 것보다 약간 빠릅니다. 반면에 Java는...글쎄요. 결과는 다음에서 확인할 수 있습니다.이 커밋 메시지:

비교를 위해 2.3GiB 파일의 경우(최소/평균/max/sd 초 (n=10):

  • 오줌 sha256sum md5sum < 파일: 16.5/16.9/17.4/.305
  • python3 summary.py-sha256-md5 <파일:13.7/15.0/18.7/1.77
  • python2 summary.py-sha256-md5 <파일:13.7/15.9/18.7/1.64
  • jacksum -a sha256+md5 -F '#CHECKSUM{i} #FILENAME': 32.7/37.1/50/6.91

해시 출력은 coreutils에서 생성된 출력과 호환됩니다. 길이는 해싱 알고리즘에 따라 달라지므로 도구는 이를 인쇄하지 않습니다. 사용법( pee비교를 위해 추가됨):

$ ./digest.py -sha256 -md5 digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  digest.py
b575edf6387888a68c93bf89291f611c  digest.py
$ ./digest.py -sha256 -md5 <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -
$ pee sha256sum md5sum <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -

관련 정보