Pergunta

Existe algum algoritmo rápido que permite comparar dois arquivos (para fins de verificação), sem necessidade de ler todo o conteúdo?

Foi útil?

Solução

Você pode usar um hash MD5 em ambos os arquivos e compará-los dessa forma. No entanto, não tecnicamente ler o arquivo inteiro. Você não será capaz de ter 100% de certeza sem verificar Eu não acho.

Em C # seria fazer isso da seguinte forma (desculpe, você não mencionou um idioma específico):

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

Outras dicas

Você poderia escrever um procedimento CRC personalizado que lê bits do arquivo. por exemplo. 16 bytes para cada 1k ou algo como que em vez de CRCing o arquivo inteiro. É mais arriscado, é claro, já que os dados poderiam alterar o local onde você não está olhando e não ter um efeito sobre seus blocos de comparação. Mas CRC é um pouco arriscado demais uma vez que dois conjuntos de dados muito diferentes poderia retornar o mesmo valor.

Não há algoritmo para ser 100% certeza de que os arquivos são os mesmos, a menos que você lê cada byte. A prova é simples - assumir tal existe um algoritmo, e nós usá-lo para comparar dois arquivos. Isso implica um certo número de bytes não são lidos pelo algoritmo. Eu posso fazer com que o algoritmo falhar, alterando os bytes em um arquivo mas não o outro.

É matematicamente impossível determinar que dois arquivos de mesmo tamanho são iguais sem ler ambos completamente, mas é muito possível para determinar que eles são não igual sem ler ambos inteiramente. Isso pode ser feito de várias maneiras, tais como a utilização de funções hash ou comparação curto-circuito.

Eu tenho medo que você não pode evitar uma leitura completa de ambos os arquivos para ter certeza absoluta que eles são iguais.

Você pode primeiro verificar o tamanho tanto de arquivo; Se eles são diferentes, os arquivos são diferentes (mas que sobre arquivos de texto que só diferem na linha separadora?).

Se o tamanho é o mesmo, não vejo qualquer maneira correta de ir mais longe, mas começando a ler os dois arquivos. Claro que pode parar logo que difere de buffer, mas poderia único estado que arquivos são realmente é igual ao último caractere como foi processado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top