Rumah >pembangunan bahagian belakang >C++ >Bolehkah Perbandingan Checksumming dan Chunk Mempercepatkan Perbandingan Fail dalam .NET?

Bolehkah Perbandingan Checksumming dan Chunk Mempercepatkan Perbandingan Fail dalam .NET?

Barbara Streisand
Barbara Streisandasal
2025-01-10 16:33:44176semak imbas

Can Checksumming and Chunk Comparison Speed Up File Comparison in .NET?

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:

  • Perbandingan sekatan: 1063ms
  • Perbandingan bait demi bait: 3031ms
  • Cincang: 865ms

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn