2008-10-22 4 views
4

파일의 변경된 비트를 복제 용 다른 파일과 비교하여 결정하기 위해 C++로 도구를 작성해야합니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?C++에서 변경된 데이터를 확인하는 가장 좋은 방법

특정 OS 또는 라이브러리를 염두에두고 있지 않아도 좋습니다. 나의 주요 목표는 복제와 관련된 네트워크 트래픽의 양을 줄이는 것입니다.

답변

17

rsync는 파일을 블록으로 분할하고 각 블록에 대한 체크섬을 계산 한 다음 필요한 경우에만 블록 데이터를 전송하기 전에 체크섬 만 전송하여 대상에 변경 사항이 있는지 확인합니다. 당신이 그대로 rsync를 사용할 수없는 경우 내가 사랑하는 일부 구현을 시도하여 시작할 것

+0

실제로는 블록 체크되지 않은 위치로 이동 한 경우에도 동일한 블록을 감지 할 수있는 롤링 체크섬을 사용합니다. – ephemient

+0

답변을 작성하는 동안 rsync의 장점을 언급하는 것을 잊어 버렸습니다. 두 버전의 파일을 보낸 사람 컴퓨터에서 동기화하지 않고도 작동합니다. – Alexander

0
+0

Diff는 일반적으로 모든 데이터를 비교하여 작동합니다. 아니 네트워크 트래픽을 줄이기 위해 원하는 ... – dmckee

+0

@ dmckee, 그것은 정확한 시나리오에 따라 다릅니다. 일부 시나리오에서는 각 파일의 두 버전을 모두 보낸 사람 컴퓨터에서 사용할 수 있습니다. 이 경우 diff/delta를 생성하여 rsync보다 훨씬 적은 트래픽을 발생시킬 수 있습니다. – Alexander

3

librsync을 확인합니다. 오래된 코드이지만 코드를 읽고 향상시키는 것이 쉽습니다.

0

제안 : 변경 블록 범위를 좁히려면 해시 함수 & 나누기 & 나누기 접근 방식을 사용하십시오. 정확히 충돌 방지 솔루션은 아니지만 SHA-2 IMO가 도움이 될 수 있습니다.

2

동일한 컴퓨터에 이전 버전과 새 버전의 파일이없는 경우 rsync와 유사한 알고리즘이 전달 방법입니다 (이전 답변 참조). 동일한 컴퓨터에 이전 버전과 새 버전의 파일이 모두있는 경우 rsync보다 더 나은 작업을 수행 할 수 있습니다. 압축 된 diff를 생성하고 네트워크를 통해 보내십시오.

효율적인 diff를 생성하려면 VCDIFF (RFC 3284) 2 진수 델타 압축을 살펴보십시오. 하나의 좋은 구현은 xdelta (www.xdelta.org)입니다. 라이센스 문제로 인해 수신 측에서 xdelta를 사용하지 않으려는 경우 디코더/압축 해제기를 구현하는 것이 매우 쉽습니다. compact diffs를 생성 할 자체 VCDIFF diff 생성기를 작성하는 것은 훨씬 더 복잡합니다 (예 : 이동 된 블록 검색을 생각해보십시오).

또한 VCDIF에서 diff는 원본이 아니기 때문에 소스 파일 (diff가 적용된 파일)없이 곧바로 대상 파일로 압축을 풀 수 있습니다. VCDIFF 파일을 압축하면 파일을 압축 할 때 특수한 경우입니다. 두 파일 사이의 압축 된 델타. 대상에 파일 버전이 있는지 여부에 관계없이 동일한 형식을 사용할 수 있기 때문에 유용합니다.

관련 문제