문제

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

특정 OS 나 라이브러리가 없으며 제안에 열려 있습니다. 나의 주요 목표는 복제와 관련된 네트워크 트래픽의 양을 줄이는 것입니다.

도움이 되었습니까?

해결책

rsync를보십시오 - 파일을 블록으로 나누고, 각 블록의 체크섬을 계산하고, 체크섬 만 전송하여 필요한 경우에만 블록 데이터를 전송하기 전에 대상의 Changesto가 있는지 확인합니다.

다른 팁

RSYNC를 그대로 사용할 수없는 경우 확인하십시오 librsync. 오래되었지만 코드는 읽고 개선하기 쉽습니다.

동일한 컴퓨터에 기존 버전의 파일이없는 경우 RSYNC와 같은 알고리즘이 앞으로 나아갈 수 있습니다 (이전 답변 참조). 동일한 컴퓨터에 이전 버전의 파일과 새 버전의 파일이 모두 있으면 RSYNC보다 더 잘 수행 할 수 있습니다. 압축 된 차이를 생성하여 네트워크를 통해 보냅니다.

효율적인 차이를 생성하려면 VCDIFF (RFC 3284) 바이너리 델타 압축을 살펴보십시오. 좋은 구현은 Xdelta (www.xdelta.org)입니다. 라이센스 문제로 인해 수신 종료에서 Xdelta를 사용하지 않으려면 디코더/감압제를 구현하는 것은 상당히 쉽습니다. 컴팩트 한 차이를 생성하는 자신의 vcdiff diff 생성기를 작성하는 것이 훨씬 더 복잡합니다 (예로서 움직 인 블록을 검색한다고 생각하십시오).

vcdiff에서 diffs는 또한 sourceles 일 수 있습니다. 즉, 소스 파일없이 대상 파일로 압축 해제 (diff가 적용되는 파일) - vcdiff에서는 파일을 압축하는 경우 두 가지 사이에 압축 된 델타를 생성하는 특별한 경우입니다. 파일. 대상에 파일 버전이 있는지 여부에 관계없이 동일한 형식을 사용할 수 있기 때문에 유용합니다.

나는 diff의 일부 구현을 시도하는 것으로 시작합니다 (http://en.wikipedia.org/wiki/diff)

제안 : 해시 함수 및 A 분할 및 정복 접근 방식을 사용하여 변화 블록을 좁히십시오 (들). 충돌 증명 솔루션은 아니지만 SHA-2 IMO가 귀하에게 도움이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top