Teknologi perbandingan fail yang cekap .NET
Membandingkan fail bait demi bait ialah kaedah biasa, tetapi ia tidak cekap. Artikel ini meneroka kaedah yang lebih pantas untuk membandingkan fail dan memperkenalkan perpustakaan dalam .NET untuk menjana jumlah semak.
Bolehkah perbandingan checksum meningkatkan kelajuan?
Ya, menggunakan algoritma seperti CRC untuk perbandingan checksum adalah lebih pantas daripada kaedah bait demi bait. Jumlah semak menjana tandatangan unik untuk setiap fail, membenarkan tandatangan dibandingkan dan bukannya keseluruhan fail.
Pustaka penjanaan checksum fail .NET
Berbilang perpustakaan .NET menyediakan keupayaan penjanaan checksum fail:
System.Security.Cryptography.MD5
: Hasilkan jumlah semak MD5 bagi fail. System.Security.Cryptography.SHA1
: Kira jumlah semak SHA1 fail. System.Security.Cryptography.SHA256
: Kira jumlah semak SHA256 fail. System.Security.Cryptography.SHA512
: Hasilkan jumlah semak SHA512 bagi fail. Kaedah perbandingan yang dioptimumkan
Walaupun pencincangan ialah kaedah yang pantas, anda boleh mengoptimumkan lagi perbandingan fail menggunakan kaedah yang membaca sebahagian besar bait dan membandingkannya sebagai nombor:
<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>
Keputusan ujian prestasi
Ujian prestasi menunjukkan bahawa untuk fail besar (seperti fail video 100MB), membandingkan blok fail kerana nombor mengatasi perbandingan bait demi bait dan cincang:
Untuk fail yang lebih kecil, pencincangan biasanya lebih pantas kerana sifatnya yang dioptimumkan. Walau bagaimanapun, untuk fail besar, overhed membaca dan memproses keseluruhan fail boleh menjadi ketara, dan kaedah perbandingan blok adalah lebih pantas.
Atas ialah kandungan terperinci Bolehkah Perbandingan Checksumming dan Chunk Mempercepatkan Perbandingan Fail dalam .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!