.NET 효율적인 파일 비교 기술
파일을 바이트 단위로 비교하는 것은 일반적인 방법이지만 비효율적입니다. 이 문서에서는 파일을 비교하는 더 빠른 방법을 살펴보고 체크섬 생성을 위해 .NET의 라이브러리를 소개합니다.
체크섬 비교를 통해 속도가 향상될 수 있나요?
예, 체크섬 비교를 위해 CRC와 같은 알고리즘을 사용하는 것이 바이트별 방법보다 빠릅니다. 체크섬은 각 파일에 대해 고유한 서명을 생성하므로 전체 파일이 아닌 서명을 비교할 수 있습니다.
.NET 파일 체크섬 생성 라이브러리
여러 .NET 라이브러리는 파일 체크섬 생성 기능을 제공합니다.
System.Security.Cryptography.MD5
: 파일의 MD5 체크섬을 생성합니다. System.Security.Cryptography.SHA1
: 파일의 SHA1 체크섬을 계산합니다. System.Security.Cryptography.SHA256
: 파일의 SHA256 체크섬을 계산합니다. System.Security.Cryptography.SHA512
: 파일의 SHA512 체크섬을 생성합니다. 최적화된 비교방법
해싱은 빠른 방법이지만 큰 바이트 청크를 읽고 숫자로 비교하는 방법을 사용하면 파일 비교를 더욱 최적화할 수 있습니다.
<code class="language-csharp">const int BYTES_TO_READ = sizeof(Int64); static bool FilesAreEqual(FileInfo first, FileInfo second) { if (first.Length != second.Length) return false; if (string.Equals(first.FullName, second.FullName, StringComparison.OrdinalIgnoreCase)) return true; int iterations = (int)Math.Ceiling((double)first.Length / BYTES_TO_READ); using (FileStream fs1 = first.OpenRead()) using (FileStream fs2 = second.OpenRead()) { byte[] one = new byte[BYTES_TO_READ]; byte[] two = new byte[BYTES_TO_READ]; for (int i = 0; i < iterations; i++) { int read1 = fs1.Read(one, 0, BYTES_TO_READ); int read2 = fs2.Read(two, 0, BYTES_TO_READ); if (read1 != read2 || !one.SequenceEqual(two)) return false; } } return true; }</code>
성능 테스트 결과
성능 테스트에 따르면 대용량 파일(예: 100MB 비디오 파일)의 경우 파일 블록을 숫자로 비교하는 것이 바이트별 비교 및 해시보다 성능이 뛰어난 것으로 나타났습니다.
작은 파일의 경우 일반적으로 해싱은 최적화된 특성으로 인해 더 빠릅니다. 그러나 대용량 파일의 경우 전체 파일을 읽고 처리하는 오버헤드가 클 수 있으며 블록 비교 방법이 더 빠릅니다.
위 내용은 체크섬 및 청크 비교를 통해 .NET에서 파일 비교 속도를 높일 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!