Heim > Backend-Entwicklung > C++ > Können Prüfsummen und Chunk-Vergleich den Dateivergleich in .NET beschleunigen?

Können Prüfsummen und Chunk-Vergleich den Dateivergleich in .NET beschleunigen?

Barbara Streisand
Freigeben: 2025-01-10 16:33:44
Original
173 Leute haben es durchsucht

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

.NET effiziente Dateivergleichstechnologie

Der Byte-für-Byte-Vergleich von Dateien ist eine gängige Methode, aber sie ist ineffizient. In diesem Artikel werden schnellere Methoden zum Vergleichen von Dateien untersucht und Bibliotheken in .NET zum Generieren von Prüfsummen vorgestellt.

Kann der Prüfsummenvergleich die Geschwindigkeit verbessern?

Ja, die Verwendung von Algorithmen wie CRC für den Prüfsummenvergleich ist schneller als die byteweise Methode. Prüfsummen generieren eine eindeutige Signatur für jede Datei, sodass Signaturen statt ganzer Dateien verglichen werden können.

Bibliothek zur Generierung von Prüfsummen für .NET-Dateien

Mehrere .NET-Bibliotheken bieten Funktionen zur Generierung von Dateiprüfsummen:

  • System.Security.Cryptography.MD5: MD5-Prüfsumme der Datei generieren.
  • System.Security.Cryptography.SHA1: Berechnen Sie die SHA1-Prüfsumme der Datei.
  • System.Security.Cryptography.SHA256: Berechnen Sie die SHA256-Prüfsumme der Datei.
  • System.Security.Cryptography.SHA512: SHA512-Prüfsumme der Datei generieren.

Optimierte Vergleichsmethode

Während Hashing eine schnelle Methode ist, können Sie Dateivergleiche mit einer Methode weiter optimieren, die große Byteblöcke liest und sie als Zahlen vergleicht:

<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>
Nach dem Login kopieren

Ergebnisse des Leistungstests

Leistungstests zeigen, dass bei großen Dateien (z. B. einer 100-MB-Videodatei) der Vergleich von Dateiblöcken als Zahlen besser ist als Byte-für-Byte-Vergleiche und Hashes:

  • Blockvergleich: 1063 ms
  • Byte-für-Byte-Vergleich: 3031 ms
  • Hash: 865 ms

Bei kleineren Dateien ist das Hashing aufgrund seiner optimierten Natur normalerweise schneller. Bei großen Dateien kann der Aufwand für das Lesen und Verarbeiten der gesamten Datei jedoch erheblich sein und die Blockvergleichsmethode ist schneller.

Das obige ist der detaillierte Inhalt vonKönnen Prüfsummen und Chunk-Vergleich den Dateivergleich in .NET beschleunigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage