md5sum을 기반으로 여러 파일 병합

md5sum을 기반으로 여러 파일 병합

여러 조각으로 분할된 data.txt 파일이 있습니다. 원본 파일 data.txt를 만들려면 파일 조각을 올바르게 결합해야 합니다. 조각 이름에 계층 구조가 없기 때문에 어떤 프로그램이 이 작업을 수행할지 모르겠습니다. 하지만 md5sumdata.txt 파일(조각 목록이 나열되어 있음)이 있습니다 . 이 md5sum파일을 사용하여 조각에서 전체 파일을 복구하려면 어떻게 해야 합니까 ?

답변1

perl -MAlgorithm::Combinatorics=permutations \
  -le '$i=permutations(\@ARGV); while ($p=$i->next) { $n++; print "combo$n @$p" }' frag1 frag2 frag3 frag4 \
| while read out a b c d; do cat $a $b $c $d > $out; md5 $out; done

또는 GNU 도구가 있으면 md5sum대신 그렇게 할 수 있습니다.md5

답변2

조각이 몇 개 있나요? 조각의 모든 순열을 시도해야 하는 것처럼 들리므로(또는 올바른 조각을 찾을 때까지) 상대적으로 적은 수의 조각으로 문제를 해결하면 많은 작업이 발생하게 됩니다.

답변3

일부의 체크섬을 아는 것은 전체의 체크섬을 계산하는 데 도움이 되지 않으므로 올바른 순열을 찾을 때까지 가능한 모든 순열의 체크섬을 계산해야 합니다. 당신이 가지고 있다면N부분이 있어요N! (계승N) 순열, 가능성이 동일하다면 처리해야 합니다.N올바른 것을 찾을 때까지 평균 !/2입니다.

접두사가 동일한 여러 문자열에 대한 체크섬을 계산해야 하는 경우 MD5 함수의 내부 상태를 저장하여 시간을 절약할 수 있습니다. 예를 들어, 세 부분(X, Y, Z)에 대해 MD5(X+Y+Z), MD5(X+Z+Y), MD5(Y+X+Z), MD5(Y +Z+ X), MD5(Z+X+Y) 및 MD5(Z+Y+X). MD5(X,…) 계산을 시작하면 상태를 복사하고 접미사 Y+Z 및 Z+Y 계산을 완료합니다. 그러나 출력이 아닌 내부 상태를 원하며 대부분의 도구는 내부 상태에 대한 액세스를 허용하지 않습니다.

파이썬해시 라이브러리copy해시 함수의 내부 상태를 복사하는 방법을 제공합니다 . 그것은 또한열거 순열을 위한 반복자표준 라이브러리에 있습니다.

#!/usr/bin/env python2
import hashlib, itertools, sys

def look_for_permutation(goal, filenames):
    n = len(filenames)
    files = map(open, filenames)
    previous = map(lambda _: None, filenames)
    states = [hashlib.md5()] + [None] * (n-2)
    for current in itertools.permutations(files):
        i = 0
        while current[i] == previous[i]:
            i += 1
        state = states[i].copy()
        for f in current[i:n-2]:
            state.update(f.read())
            i += 1
            states[i] = state.copy()
            f.seek(0)
        state.update(current[n-2].read())
        current[n-2].seek(0)
        state.update(current[n-1].read())
        if state.hexdigest() == goal:
            return current
        current[n-1].seek(0)
        previous = current
    return None

if __name__ == '__main__':
    result = look_for_permutation(sys.argv[1], sys.argv[2:])
    if result:
        for f in result: print f.name
        sys.exit(0)
    else:
        sys.exit(1)

스크립트는 해시 계산을 최적화하지만 파일 내용을 반복적으로 읽습니다. 파일 내용이 메모리에 맞으면 파일을 한꺼번에 로드하여 작업 속도를 높일 수 있습니다.

관련 정보