さまざまなデバイスにあるMP3を追跡するために、簡単なMP3カタログを作成しています。名前が変更されたり移動されたりした場合でも、MD5またはSHA2キーを使用して一致するファイルを識別することを計画していました。論理的に同等の(つまり、同じ曲であるがエンコードが異なる)MP3を一致させようとはしていません。私は約8000のMP3を持っています。それらのうち約6700のみが一意のキーを生成しました。
私の問題は、選択したハッシュアルゴリズムに関係なく、衝突が発生していることです。あるケースでは、同じアルバムのトラック#1と#2である2つのファイルがあります。これらはファイルサイズが異なりますが、MD5、SHA2-256、SHA2-512などを使用しても同じハッシュキーを生成します。
ファイルにハッシュキーを実際に使用するのはこれが初めてであり、これは予期しない結果です。これらのハッシュアルゴリズムについて私が知っていることから、ここで何か怪しいことが起こっているように感じます。これはMP3またはPythonの実装に関連する問題でしょうか?
これが私が使用しているコードのスニペットです:
data = open(path, 'r').read()
m = hashlib.md5(data)
m.update(data)
md5String = m.hexdigest()
なぜこれが起こっているのかについての答えや洞察をいただければ幸いです。前もって感謝します。
--更新-:
Linux(Python 2.6を使用)でこのコードを実行しようとしましたが、衝突は発生しませんでした。stat呼び出しで示されているように、ファイルは同じではありません。WinMD5もダウンロードしましたが、衝突は発生しませんでした(8d327ef3937437e0e5abbf6485c24bb3および9b2c66781cbe8c1be7d6a1447994430c)。これはWindows上のPythonhashlibのバグですか?Python 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