하나의 파일을 성공적으로 다운로드했고 다른 파일이 같은 파일 인 것으로 의심되는 다운로드에 실패했습니다 (큰 파일의 처음 100MB 만).
이것을 확인하기 위해 해시를 확인하고 싶지만 다운로드하지 못한 파일의 일부만 가지고 있기 때문에 처음 몇 메가 바이트 정도만 해시하고 싶습니다.
어떻게해야합니까?
OS는 Windows이지만 Cygwin과 MinGW가 설치되어 있습니다.
하나의 파일을 성공적으로 다운로드했고 다른 파일이 같은 파일 인 것으로 의심되는 다운로드에 실패했습니다 (큰 파일의 처음 100MB 만).
이것을 확인하기 위해 해시를 확인하고 싶지만 다운로드하지 못한 파일의 일부만 가지고 있기 때문에 처음 몇 메가 바이트 정도만 해시하고 싶습니다.
어떻게해야합니까?
OS는 Windows이지만 Cygwin과 MinGW가 설치되어 있습니다.
답변:
파일을 비교하기 위해 해시를 작성하면 한 파일을 여러 파일과 비교하거나 많은 파일을 서로 비교할 때 의미가 있습니다.
두 파일을 한 번만 비교하는 경우에는 의미가 없습니다. 해시를 계산하려는 노력은 파일을 살펴보고 직접 비교하는 것만큼이나 높습니다.
효율적인 파일 비교 도구는 cmp
다음과 같습니다.
cmp --bytes $((100 * 1024 * 1024)) file1 file2 && echo "File fragments are identical"
dd
두 파일의 임의 부분 (처음부터는 아님)을 비교하기 위해 다음과 같이 결합 할 수도 있습니다 .
cmp \
<(dd if=file1 bs=100M count=1 skip=1 2>/dev/null) \
<(dd if=file2 bs=100M count=1 skip=1 2>/dev/null) \
&& echo "File fragments are identical"
cmp
경우 이미 설치되어 있는지 99.99 % 확실 bash
하며 작업을 수행합니다. 실제로, cmp -n 131072 one.zip two.zip
일도 할 것입니다. 입력하기 가장 적은 문자 및 가장 빠른 실행. 해시 계산은 의미가 없습니다. 그것은 읽을 수 있도록 전체 메가 바이트 파일이 필요 플러스 무의미 전체 파일의 100MB의 부분을. 파일이 zip 파일이고 다른 경우 처음 몇 백 바이트 내에 차이가 있습니다. Readahead는 기본적으로 128k를 제공하므로 128k를 비교할 수도 있습니다 (1 바이트 비교와 동일한 비용).
--bytes
옵션은 작업을 복잡하게 만듭니다. cmp
이 옵션없이 실행 하면 파일간에 다른 첫 번째 바이트가 표시됩니다. 모든 바이트가 동일 EOF
하면 더 짧은 파일에 표시 됩니다. 이것은 당신에게 당신의 예제보다 더 많은 정보를 줄 것입니다-얼마나 많은 바이트가 올바른지.
cmp
(그리고 거의 모든 사람들이 생각하는 것처럼) 호출을 사용 --ignore-initial
하여 --bytes
일을 복잡하게 만드는 대신 사용 하고 인수 할 수 있습니다 dd
.
나는 그것을 정확하게 시도 할 수 없어서 미안하지만, 이런 식으로 작동합니다
dd if=yourfile.zip of=first100mb1.dat bs=100M count=1
dd if=yourotherfile.zip of=first100mb2.dat bs=100M count=1
그러면 두 파일 중 처음 100MB가 표시됩니다.
이제 해시를 얻으십시오.
sha256sum first100mb1.dat && sha256sum first100mb2.dat
직접 실행할 수도 있습니다.
dd if=yourfile.zip bs=100M count=1 | sha256sum
dd if=yourotherfile.zip bs=100M count=1 | sha256sum
cmp
.
cmp
)이 의심의 여지없이 승자입니다. 그러나 문제를 해결하는이 방법 (해시 사용)도 실제로 문제를 해결하는 한 존재할 수 있습니다 (:
이진 / 16 진수 diff 프로그램을 사용하여 파일을 직접 비교할 수 있습니다 vbindiff
. Linux 및 Windows에서 최대 4GB의 파일을 빠르게 비교합니다.
빨간색으로 강조된 차이 (1B와 1C) 만있는 다음과 같습니다.
one
0000 0000: 30 5C 72 A7 1B 6D FB FC 08 00 00 00 00 00 00 00 0\r..m.. ........
0000 0010: 00 00 00 00 ....
0000 0020:
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080:
0000 0090:
0000 00A0:
two
0000 0000: 30 5C 72 A7 1C 6D FB FC 08 00 00 00 00 00 00 00 0\r..m.. ........
0000 0010: 00 00 00 00 ....
0000 0020:
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080:
0000 0090:
0000 00A0:
┌──────────────────────────────────────────────────────────────────────────────┐
│Arrow keys move F find RET next difference ESC quit T move top │
│C ASCII/EBCDIC E edit file G goto position Q quit B move bottom │
└──────────────────────────────────────────────────────────────────────────────┘
vbindiff
(및 Konrad 's cmp
)는 이진 데이터를 바이트 단위로 비교합니다. 실제로 값이 충돌을 일으킬 가능성이 훨씬 더 높습니다
cmp는 두 파일이 더 작은 파일의 길이와 동일 할 때 알려줍니다.
$ dd if=/dev/random bs=8192 count=8192 > a
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.514571 secs (130417197 bytes/sec)
$ cp a b
$ dd if=/dev/random bs=8192 count=8192 >> b
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.512228 secs (131013601 bytes/sec)
$ cmp a b
cmp: EOF on a
cmp는 두 파일 간의 차이를 감지하기 전에 파일 a에서 EOF가 발생했음을 알려줍니다.