Heim > Backend-Entwicklung > C++ > Wie kann ich Dateien in .NET effizienter als Byte für Byte vergleichen?

Wie kann ich Dateien in .NET effizienter als Byte für Byte vergleichen?

DDD
Freigeben: 2025-01-10 16:45:41
Original
497 Leute haben es durchsucht

How Can I Compare Files in .NET More Efficiently Than Byte-by-Byte?

Effiziente .NET-Dateivergleichsmethode

Der Vergleich zweier Dateien in .NET kann sehr zeitaufwändig sein, insbesondere bei großen Dateien. Die herkömmliche Methode, Binärdateien Byte für Byte zu lesen und zu vergleichen, ist ineffizient und langsam.

Alternative Methoden

Um die Leistung zu verbessern, ziehen Sie die folgenden Alternativen in Betracht:

Methode zum Zusammenführen von Dateien

Eine überraschend schnelle Methode besteht darin, die beiden Dateien in einem einzelnen Byte-Array zu verketten und die resultierenden Werte zu vergleichen.

<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++)
        {
            fs1.Read(one, 0, BYTES_TO_READ);
            fs2.Read(two, 0, BYTES_TO_READ);
            if (!one.SequenceEqual(two))
                return false;
        }
    }
    return true;
}</code>
Nach dem Login kopieren

Prüfsummenvergleich

Eine andere Methode besteht darin, mithilfe eines Prüfsummenalgorithmus wie CRC oder MD5 einen Fingerabdruck jeder Datei zu erstellen. Der Vergleich dieser Fingerabdrücke ist viel schneller als der Vergleich ganzer Dateien.

<code class="language-csharp">static bool FilesAreEqual_Hash(FileInfo first, FileInfo second)
{
    byte[] firstHash = MD5.Create().ComputeHash(first.OpenRead());
    byte[] secondHash = MD5.Create().ComputeHash(second.OpenRead());

    for (int i = 0; i < firstHash.Length; i++)
    {
        if (firstHash[i] != secondHash[i])
            return false;
    }
    return true;
}</code>
Nach dem Login kopieren

Leistungsvergleich

Im Test großer Videodateien war die Leistung der Dateizusammenführungsmethode etwa dreimal so hoch wie die der Byte-für-Byte-Vergleichsmethode, während der Hash-Vergleich mit durchschnittlich etwa 865 Millisekunden schneller war.

Die beste Methode hängt von der Größe und Art der Dateien ab, die Sie vergleichen möchten. Diese Alternativen bieten jedoch erhebliche Leistungsverbesserungen gegenüber herkömmlichen Byte-für-Byte-Vergleichsmethoden.

Das obige ist der detaillierte Inhalt vonWie kann ich Dateien in .NET effizienter als Byte für Byte vergleichen?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage