간단한 MP3 카탈로그를 작성하여 다양한 MP3에 어떤 트랙이 있는지 추적합니다. MD5 또는 SHA2 키를 사용하여 이름이 바뀌거나 이동 된 경우에도 일치하는 파일을 식별 할 계획이었습니다. 논리적으로 동일한 MP3를 (즉, 동일한 노래이지만 인코딩이 다르게) 일치시키려는 것이 아닙니다. 나는 약 8000 MP3를 가지고있다. 약 6700 개만 고유 키를 생성했습니다.Python의 MD5 및 SHA-2 충돌
내 문제는 내가 선택한 해시 알고리즘에 관계없이 충돌이 발생한다는 것입니다. 하나의 경우, 나는 같은 앨범에서 트랙 # 1과 # 2가되는 두 개의 파일을 가지고 있는데, MD5, SHA2-256, SHA2-512 등을 사용하더라도 파일 크기가 다르지만 동일한 해시 키를 생성합니다.
파일에서 해시 키를 실제로 사용하는 것은 이번이 처음이며 예기치 않은 결과입니다. 나는이 해싱 알고리즘에 대해 알고있는 작은 것에서 비린내가 일어나고 있다고 느낍니다. 이것이 MP3 또는 파이썬의 구현과 관련된 문제 일 수 있습니까?
data = open(path, 'r').read()
m = hashlib.md5(data)
m.update(data)
md5String = m.hexdigest()
어떤 답변이나이 많이 주시면 감사하겠습니다 일어나는 이유에 대한 통찰력을 :
는 여기에 내가 사용하고 코드의 조각입니다. 미리 감사드립니다.
--UPDATE--
는 :나는 (파이썬 2.6) 리눅스에서이 코드를 실행 시도하고 충돌을 발생하지 않았다. stat 호출에서 보여 주듯이 파일은 동일하지 않습니다. 또한 WinMD5를 다운로드했는데 충돌이 발생하지 않았습니다 (8d327ef3937437e0e5abbf6485c24bb3 및 9b2c66781cbe8c1be7d6a1447994430c). 이 버그는 Windows에서 Python hashlib의 버그입니까? 파이썬 2.7.1과 2.6.6에서 똑같은 결과를 얻었습니다. 여러 해시 알고리즘 모두가 그들에 동일한 해시 결과를 반환 할 경우에 문제가 발생하는
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
MP3 파일이 실제로 실제로 다른가요? 특히 SHA-1 및 SHA-2와 같이 더 크고 고급 알고리즘의 경우 해싱 충돌이 거의 발생하지 않습니다. 충돌이 많으면 실제로 중복 파일이 많을 수도 있습니다. –
BTW, 왜 m.update()를 호출합니까? m = hashlib.md5 ("foo"); m.update ("foo")는 m = hashlib.md5 ("foofoo")와 동일합니다. –