Вопрос

Существует ли какой-нибудь быстрый алгоритм, позволяющий сравнивать два файла (в целях проверки) без необходимости читать все содержимое?

Это было полезно?

Решение

Вы можете использовать хэш MD5 для обоих файлов и сравнить их таким образом.Однако технически он читает весь файл.Я не думаю, что вы не сможете быть уверены на 100%, не проверив.

В C# это можно сделать следующим образом (извините, вы не упомянули конкретный язык):

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));
}

Другие советы

Вы можете написать специальную процедуру CRC, которая считывает биты файла.например16 байт на каждый 1 КБ или что-то в этом роде вместо CRC всего файла.Конечно, это более рискованно, поскольку данные могут измениться там, где вы не смотрите, и не повлиять на сравниваемые блоки.Но CRC тоже немного рискован, поскольку два совершенно разных набора данных могут возвращать одно и то же значение.

Не существует алгоритма, позволяющего быть на 100% уверенным, что файлы одинаковы, если вы не читаете каждый байт.Доказательство простое — предположим, что такой алгоритм существует, и мы используем его для сравнения двух файлов.Это означает, что некоторое количество байтов не считывается алгоритмом.Я могу вызвать сбой алгоритма, изменив эти байты в одном файле, но не в другом.

Математически невозможно определить, что два файла одинакового размера равны, не прочитав их оба целиком, но вполне возможно определить, что они равны. не равный не читая оба целиком.Это можно сделать различными способами, например, с помощью хеш-функций или короткого сравнения.

Боюсь, вам не удастся избежать полного чтения обоих файлов, чтобы быть полностью уверенным, что они равны.

Сначала вы можете проверить размер обоих файлов;если они разные, то и файлы разные (а как насчет текстовых файлов, которые отличаются только разделителем строк?).

Если размер одинаковый, я не вижу правильного способа пойти дальше, кроме как начать читать оба файла.Конечно, он может остановиться, как только буфер изменится, но он может только констатировать, что файлы Действительно равно, когда был обработан последний символ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top