2010-05-11 26 views
6

¿Existe alguna manera confiable de determinar si dos archivos son iguales o no? Por ejemplo, dos archivos con el mismo tamaño y tipo pueden ser o no el mismo binarilly (sí, sé que no es realmente una palabra). Asumo que la comparación de uno o dos sumas de comprobación de los archivos va a ayudar, pero me pregunto:Determinar si un archivo es un duplicado

  1. ¿Cuán confiables son las sumas de comprobación en determinar si dos archivos son diferentes; ¿Cuáles son las posibilidades de que dos archivos diferentes tengan la misma suma de comprobación?
  2. ¿La confiabilidad aumentaría en aplicando suma de comprobación adicional comparaciones?
  3. ¿Qué algoritmo (s) de suma de verificación sería el más eficiente y/o confiable?

¡Se agradecen todas las ideas, sugerencias o pensamientos!

P.S. El código para esto se está escribiendo en Java ejecutándose en un sistema nix, pero la entrada genérica o de plataforma independiente es más útil.

+3

comida extra para pensar ... Estaba trabajando en algo similar para eliminar archivos duplicados y descubrí que hacer sumas de parciales aceleraba mucho el proceso. Compute SHA-1 en los primeros 4k. Si son lo mismo, haz todo el archivo. También podría comparar directamente los primeros 4k bytes, achicando la primera diferencia. Todo depende de cuál sea tu objetivo final. – basszero

Respuesta

5
1) Very reliable 
2) Not theoretically 
3) SHA-1 
+1

¿No debería 2) ser "No en la práctica" o "Teóricamente"? La fiabilidad ciertamente aumenta en teoría. – IVlad

+0

Ah, ¿quieres decir que quería tener varias sumas de comprobación? Como tener un sha1 y md5? – zaf

+0

@zaf: sí, al menos espero que lo haya querido decir :). – IVlad

6

Es imposible saber con certeza si dos archivos son iguales a menos que los compare byte por byte. Es similar a cómo no se puede garantizar que una colección contenga o no un objeto determinado, a menos que revise cada elemento de la colección.

Los checksums son básicamente un hash. Que sean lo suficientemente buenos para tus propósitos depende de cuán crítica sea tu aplicación. Sin duda es posible crear una función hash con bajo riesgo de colisión; después de todo, las contraseñas son hash, incluso en situaciones donde protegen los datos confidenciales y no le gustaría tener una segunda contraseña válida en su cuenta. A menos que esté escribiendo código para, digamos, un banco, un algoritmo de suma de comprobación sólida debería proporcionar una muy buena aproximación.

El uso de sumas de comprobación múltiples aumentará la fiabilidad si y solo si los diferentes algoritmos de suma de comprobación utilizan funciones hash diferentes.

Tu tercera pregunta ya ha sido solucionada por la respuesta de leonbloy; MD5 y SHA-1 son comunes.

+0

-1 para una confusión clara entre hash y checksum –

+1

@BlueRaja, ¿cómo es eso? – Pops

+0

'Las sumas de comprobación son básicamente un hash. Es al revés: los hashes son básicamente sumas de comprobación, pero con requisitos más estrictos. 'Ciertamente es posible crear una función hash con bajo riesgo de colisión. Los hash están diseñados para tener un riesgo de colisión tan bajo como sea estadísticamente posible. Cualquier otra cosa simplemente no es un hash. 'un algoritmo de suma de comprobación fuerte debería proporcionar una muy buena aproximación [de un hash]' Hashes y checksums son bestias similares con propósitos muy diferentes. CRC32 es una gran suma de comprobación, pero un hash pésimo. BCrypt es un gran hash, pero una suma de comprobación pésima (es demasiado lento). –

0

Cualquier suma de comprobación le dará un falso positivo para una cantidad muy pequeña de casos. Si puedes vivir con eso, bien. Si no es así, la forma de hacerlo es hacer la comparación de suma de comprobación primero, y si las sumas de comprobación son iguales, entonces una prueba de byte a byte. La prueba de byte por byte se realizará muy raramente, por lo que el costo promediado en muchas comparaciones será muy pequeño. SIN EMBARGO, este no es el caso cuando se espera que la mayoría de sus comparaciones sean "verdaderas".

También depende de la cantidad de archivos diferentes que está probando. Calcule una suma de comprobación de alta fiabilidad es casi tan caro como hacer una comparación: si cada archivo se compara aproximadamente una vez, entonces puede ser más barato hacer las comparaciones.

Cuestiones relacionadas