sha256sum 명령 또는 기타 해싱 명령을 병렬화하는 방법은 무엇입니까?

sha256sum 명령 또는 기타 해싱 명령을 병렬화하는 방법은 무엇입니까?

파일의 수와 크기가 크기 때문에 해시 계산 프로세스를 병렬화하고 싶습니다. 이 명령은 하나의 스레드만 사용하기 때문에 CPU 사용량을 보면 좌절감을 느낍니다. 어떻게 병렬화할 수 있습니까?

sha256sum foo.mp4
OR
openssl -dgst sha256 foo.mp4

답변1

파일 전체를 병렬화하려면 GNU Parallel을 사용할 수 있습니다.

parallel sha256sum ::: *

단일 파일의 병렬 해싱은 Merkle 트리를 사용하는 특정 해시 함수를 사용하여 수행할 수 있습니다. b3sum그런 도구입니다.

답변2

또는 최신 Intel 또는 AMD CPU와 같이 하드웨어 SHA256 계산을 지원하는 CPU로 업그레이드할 수 있습니다. 내 Ryzen 3700X는 훨씬 간단한 알고리즘인 MD5보다 훨씬 빠르게 SHA256 해시 합계를 계산합니다. 체크인 .sha_ni/proc/cpuinfo

아니면 당신은 사용할 수 있습니다블레이크 3엄청 많네요(거의 15배)서둘러요순수하게 소프트웨어로 구현된 경우에도:

여기에 이미지 설명을 입력하세요.

답변3

xargs-P여러 작업을 병렬로 실행하도록 선택할 수 있습니다 . Ole Tange의 프로그램보다 유연성이 훨씬 떨어지지 parallel만 대부분의 간단한 병렬화 작업에는 충분합니다.

예를 들어:

find . -name '*.mp4' -print0 | xargs -0r -n 1 -P 0 openssl dgst -sha256
  • -P 0xargs에게 가능한 한 많은 작업을 병렬로 실행하도록 지시합니다. 예를 들어 32스레드 Threadripper 1950x에서는 32개의 openssl작업을 병렬로 실행합니다.

  • -n 1하나의 인수만 사용하여 각 작업을 실행하도록 xargs에 지시합니다. 명령줄에서 처리할 수 있는 여러 파일 이름에 대해 하나의 작업이 최적은 아니지만 openssl dgst거의 항상 -n(또는 -L) 옵션을 xargs -P.

    그렇지 않으면 각 명령줄에 가능한 한 많은 인수를 입력하려고 시도합니다. 일반적으로 수만 개의 인수가 없으면 하나의 작업만 생성됩니다. Linux에서 명령줄 길이 제한은 일반적으로 200만 자(2097152자)입니다( 확인 getconf ARG_MAX). 이렇게 하면 많은 파일 이름이 허용됩니다.

    가장 좋은 방법은 가지고 있는 매개변수 수를 세어 이를 병렬로 실행하려는 작업 수로 나누는 것입니다. 예를 들어

    t=32
    numfiles=$(find .//. -name '*.mp4' | grep -c //)
    let n=numfiles/t
    find . -name '*.mp4' -print0 | xargs -0r -n "$n" -P "$t" openssl dgst -sha256
    

참고: -Pxargs에 대한 표준 POSIX 옵션이 아닙니다. GNU 또는 *BSD xargs가 필요합니다. 어쩌면 다른 버전이 있을 수도 있습니다.

관련 정보