2013-10-31 3 views
1

파일을 찾을 수있는 프로그램을 작성하고 있습니다.체크섬을 사용하여 파일 비교

두 개의 폴더가 있습니다. 중복 된 파일을 찾아야합니다. 최악의 시나리오에서는 나는 모든 파일을 서로 비교해야 할 것입니다. 각 파일의 체크섬을 생성하고 체크섬을 비교 한 다음 체크섬이 동일하면 파일이 정확히 동일하도록 바이트 단위로 검사합니다.

질문은 체크섬 생성기가 바이트 단위로 확인하는 대신 시간을 낭비 할 정도로 빠를 것이라고 생각합니까?

+4

체크섬을 생성하려면 파일을 1 바이트 씩 읽어야합니다. 아니, 파일 시스템은 체크섬을 생성하지 않습니다 (http://stackoverflow.com/questions/1490384/there-is-in-windows-file-systems-a-pre-computed-hash-for-each-file).), 당신은 스스로 그것을해야하고 각 파일에 대한 체크섬을 캐시해야 할 것이다. – CodeCaster

+0

나는 명확성이 부족한 질문에 대해 말로 표현할 자유를 얻었다. – Tarik

+0

확인할 가능성이있는 파일에 대해 아는 것이 있습니까? 예 : 얼마나 큰 파일이 될 것으로 기대합니까? – Rob

답변

0

모든 체크섬 알고리즘이 수행합니다. 예를 들어 MD5를 사용할 수 있습니다. I/O가 체크섬을 계산하는 데 소비 된 CPU 시간보다 느리기 때문에 시간 낭비가 거의 없습니다. CRC32을 사용할 수도 있습니다.

당신은 다음과 같이 말했습니다 : "중복 된 것을 찾아야하는 두 개의 폴더가 있습니다." 여기에 뭔가 설명하고 싶습니다. 목표가 중복 파일을 찾는 것이라면 파일이 하나, 둘 또는 x 개의 폴더에 있는지 여부는 중요하지 않습니다. n 개의 파일이 있다고 가정하면, n 개의 log n 비교 순으로 중복 된 것을 찾을 필요가 있습니다. n 개의 파일을 한 번 읽고, 체크섬을 계산 한 다음, n 개의 로그에서 n 개의 체크섬을 수행하여 중복 된 것을 찾아내는 것이 유용합니다. 그러나 파일 크기를 먼저 비교하고 동일한 크기의 파일을 3 개 이상 비교할 때 체크섬에만 의존함으로써이를 피할 수 있습니다. 그러면 복제본 검색 속도가 크게 빨라집니다.

6

파일의 전체 목록을 가져온 다음 길이별로 정렬하여 비교 횟수를 줄이고 I/O 양을 줄일 수 있습니다. 동일한 길이가 아닌 두 파일은 동일 할 수 없습니다. 따라서 디렉토리 정보를 가져 오는 것 외에는 I/O를 수행하지 않고 많은 수의 파일을 제거 할 수 있습니다.이 정보는 어쨌든 가져와야합니다.

길이가 같은 두 개의 파일 인 X가있는 경우 해당 파일의 체크섬을 계산할 필요가 없습니다. 그냥 직접 비교하십시오.

길이가 같은 파일이 세 개 이상인 경우 세 파일 모두에 대한 체크섬을 계산하고 체크섬을 비교 한 다음 체크섬이 일치하면 바이트 단위로 비교하는 것이 좋습니다.

+0

나는 내 대답을 고쳐야 할 때까지 파일 크기 비교를 먼저 배웠다. +1. – Tarik

2

먼저 Jim Mischel이 말한 것처럼 길이별로 파일을 그룹화하십시오.

비교할 파일이 큰 경우 파일의 첫 번째 n 바이트를 사용하여 대리인 (모든 체크섬)을 계산하는 것이 더 빠릅니다. 대용량 파일의 전체를 읽음으로써 체크섬을 계산하여 첫 번째 바이트가 다른 다른 파일과 비교하는 것은 비효율적입니다. 이론적으로 첫 번째 n 바이트는 파일을 n 바이트 체크섬으로 고유하게 결정합니다. (특정 길이의 모든 가능한 파일이 동등한 가능성이있는 경우입니다.)

물론 비교할 파일이 작 으면 전체 파일을 하위 집합으로 빨리 읽는 것이 좋습니다.

+0

나는 파일의 일부만 체크섬에 사용한다는 생각을 좋아한다. 가능한 대부분의 일치를 제거하고 대용량 파일의 I/O를 많이 줄일 것입니다. –

+0

똑똑한 아이디어! 팁 고마워! – Tarik