Pregunta

¿Hay algún algoritmo rápido que permite comparar dos archivos (con fines de verificación) sin necesidad de leer todo el contenido?

¿Fue útil?

Solución

Se puede usar un hash MD5 en ambos archivos y comparar esa manera. Sin embargo, no leer todo el archivo de vista técnico. Usted no será capaz de tener certeza del 100% sin comprobar que no creo.

En C # se podría hacer esto de la siguiente manera (lo siento, usted no mencionó un lenguaje 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));
}

Otros consejos

Se puede escribir un procedimiento CRC a medida que lee los bits del archivo. p.ej. 16 bytes para cada 1k o algo por el estilo en lugar de CRCing todo el archivo. Es más arriesgado, por supuesto, ya que los datos podrían posiblemente cambiar el lugar donde usted no está buscando y no tener un efecto en sus bloques de comparación. Pero CRC es un poco arriesgado demasiado, ya que dos conjuntos de datos muy diferentes podrían devolver el mismo valor.

No existe un algoritmo de estar 100% seguro de que los archivos son los mismos a menos que lea cada byte. La prueba es simple - asuma existe tal algoritmo, y lo usamos para comparar dos archivos. Eso implica una cierta cantidad de bytes no son leídos por el algoritmo. Puedo hacer que el algoritmo falle cambiando los bytes en un archivo pero no el otro.

Es matemáticamente imposible determinar que dos archivos del mismo tamaño son iguales sin necesidad de leer los dos por completo, pero es muy posible determinar que son diferente sin necesidad de leer tanto en su totalidad. Esto se puede hacer de varias maneras, tales como el uso de funciones de hash o comparación cortocircuito.

Me temo que no se puede evitar una lectura completa de los dos archivos que estar completamente seguro de que son iguales.

En primer lugar usted puede comprobar el tamaño del archivo tanto; si son diferentes, los archivos son diferentes (pero ¿qué pasa con los archivos de texto que sólo difieren en el separador de línea?).

Si el tamaño es el mismo, no veo ninguna manera correcta de ir más allá, pero a partir de leer ambos archivos. Por supuesto que puede parar tan pronto como se diferencia de amortiguación, pero sólo podría afirmar que los archivos son realmente es igual al último carácter que ha procesado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top