Frage

Gibt es einen schnellen Algorithmus, der zwei Dateien (für die Überprüfung Zweck) ohne Notwendigkeit vergleichen kann den gesamten Inhalt zu lesen?

War es hilfreich?

Lösung

Sie könnten einen MD5-Hash auf beiden Dateien verwenden und sie auf diese Weise vergleichen. Allerdings ist es technisch die gesamte Datei zu lesen. Sie zu müssen fähig sein zu 100% iger Sicherheit nicht ohne zu überprüfen, ich glaube nicht.

In C # würde man dies in der folgenden Art und Weise tun (sorry, du hast nicht eine bestimmte Sprache erwähnen):

protected string GetMD5HashFromFile(string fileName)
{
    byte[] retVal = { };

    using (FileStream file = new FileStream(fileName, FileMode.Open))
    using (MD5 md5 = new MD5CryptoServiceProvider())
    {
        retVal = md5.ComputeHash(file);
    }

    if (retVal.Length > 0)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < retVal.Length; i++)
        {
            sb.Append(retVal[i].ToString("x2"));
        }

        return sb.ToString();
    }
    else
    {
        return string.Empty;
    }
}

bool CompareFiles(string fileName1, string fileName2)
{
    return (GetMD5HashFromFile(fileName1) == GetMD5HashFromFile(fileName2));
}

Andere Tipps

Sie können einen benutzerdefinierten CRC-Prozedur schreiben, die Bits der Datei liest. z.B. 16 Bytes für jeden 1k oder so ähnlich, anstatt die gesamte Datei von CRCing. Es ist riskanter, natürlich, möglicherweise, da die Daten ändern könnte, wo Sie nicht suchen und keine Auswirkungen auf Ihre verglichenen Blöcke haben. Aber CRC ist ein wenig riskant zu, da zwei sehr unterschiedliche Datensätze könnten den gleichen Wert zurück.

Es gibt keinen Algorithmus 100% sicher, dass die Dateien sind, das gleiche zu sein, wenn Sie jedes Byte gelesen. Der Beweis ist einfach - annehmen, ein solcher Algorithmus existiert, und wir verwenden es zwei Dateien zu vergleichen. Das bedeutet, eine bestimmte Anzahl von Bytes nicht durch den Algorithmus lesen. Ich kann der Algorithmus fehlschlagen verursachen durch diese Bytes in einer Datei zu ändern, aber nicht die anderen.

Es ist mathematisch unmöglich, festzustellen, dass zwei Dateien mit derselben Größe gleich sind, ohne vollständig beide zu lesen, aber es ist durchaus möglich, zu bestimmen, dass sie ungleich , ohne beide ganz zu lesen. Dies kann auf verschiedene Arten erfolgen, wie die Verwendung von Hash-Funktionen oder Kurzschluss Vergleich.

Ich fürchte, man kann nicht eine vollständige Lese beiden Dateien vermeiden sein, ganz sicher, sie ist gleich.

Sie können zunächst beide Größe der Datei überprüfen; wenn sie unterschiedlich sind, sind die Dateien anders (aber was sind Textdateien, die nur auf der Linie Separator unterscheiden würden?).

Wenn Größe ist das gleiche, ich sehe keinen richtigen Weg weiter zu gehen, aber ausgehend beiden Dateien zu lesen. Natürlich kann es so schnell wie Puffer unterscheidet, aber es nur feststellen, stoppen könnte, dass die Dateien sind wirklich ist gleich beim letzten Zeichen wie verarbeitet worden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top