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
Lepaskan: 2025-01-10 16:33:44
asal
174 orang telah melayarinya

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan