Estoy escribiendo un simple catalogador de MP3 para mantener un registro de los MP3 que hay en mis diversos dispositivos. Estaba planeando usar claves MD5 o SHA2 para identificar los archivos coincidentes, incluso si se han renombrado/movido, etc. No estoy tratando de hacer coincidir los MP3 que son lógicamente equivalentes (es decir, la misma canción pero codificada de manera diferente). Tengo alrededor de 8000 MP3. Solo alrededor de 6700 de ellos generaron claves únicas.colisiones MD5 y SHA-2 en Python
Mi problema es que me encuentro con colisiones independientemente del algoritmo hash que elijo. En un caso, tengo dos archivos que pasan a ser las pistas n. ° 1 y n. ° 2 en el mismo álbum, tienen diferentes tamaños de archivo y producen claves hash idénticas si utilizo MD5, SHA2-256, SHA2-512, etc.
Esta es la primera vez que realmente uso claves hash en los archivos y este es un resultado inesperado. Siento que algo sospechoso está pasando aquí por lo poco que sé sobre estos algoritmos de hash. ¿Podría ser este un problema relacionado con la implementación de MP3 o Python?
Aquí está el fragmento de código que estoy usando:
data = open(path, 'r').read()
m = hashlib.md5(data)
m.update(data)
md5String = m.hexdigest()
Cualquier respuesta o reflexión, a qué está sucediendo esto sería muy apreciada. Gracias por adelantado.
--UPDATE--:
Me trataron de ejecutar este código en Linux (con Python 2.6) y no produjo una colisión. Como lo demuestra la llamada stat, los archivos no son lo mismo. También descargué WinMD5 y esto no produjo una colisión (8d327ef3937437e0e5abbf6485c24bb3 y 9b2c66781cbe8c1be7d6a1447994430c). ¿Es esto un error con Python hashlib en Windows? Intenté lo mismo en Python 2.7.1 y 2.6.6 y ambos proporcionan el mismo resultado.
import hashlib
import os
def createMD5(path):
fh = open(path, 'r')
data = fh.read()
m = hashlib.md5(data)
md5String = m.hexdigest()
fh.close()
return md5String
print os.stat(path1)
print os.stat(path2)
print createMD5(path1)
print createMD5(path2)
>>> nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=6617216L, st_atime=1303808346L, st_mtime=1167098073L, st_ctime=1290222341L)
>>> nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=4921346L, st_atime=1303808348L, st_mtime=1167098076L, st_ctime=1290222341L)
>>> a7a10146b241cddff031eb03bd572d96
>>> a7a10146b241cddff031eb03bd572d96
¿Estás seguro de que los archivos MP3 son realmente diferentes? Las colisiones hash son bastante improbables, especialmente con algoritmos más grandes y avanzados como SHA-1 y SHA-2. Tener tantas colisiones puede sugerir que realmente tienes muchos archivos duplicados. –
BTW, ¿por qué llama a m.update()? m = hashlib.md5 ("foo"); m.update ("foo") es equivalente a m = hashlib.md5 ("foofoo"). –