gpt4 book ai didi

python - Python 中的 MD5 和 SHA-2 冲突

转载 作者:太空狗 更新时间:2023-10-29 21:32:40 24 4
gpt4 key购买 nike

我正在编写一个简单的 MP3 编目器来跟踪我的各种设备上有哪些 MP3。我计划使用 MD5 或 SHA2 key 来识别匹配的文件,即使它们已被重命名/移动等。我不是要匹配逻辑上等效的 MP3(即:相同的歌曲但编码不同)。我有大约 8000 个 MP3。其中只有大约 6700 个生成了唯一 key 。

我的问题是,无论我选择哪种哈希算法,我都会遇到冲突。在一种情况下,我有两个文件恰好是同一张专辑中的轨道 #1 和 #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 上 Python hashlib 的错误吗?我在 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

最佳答案

我有种感觉,您正在读取比预期小的数据 block ,而这两个文件的数据 block 恰好相同。我不知道为什么,但尝试用“rb”打开二进制文件。 read() 应该读到文件末尾,但 windows 的行为不同。来自文档

On Windows, 'b' appended to the mode opens the file in binary mode, so there are also modes like 'rb', 'wb', and 'r+b'. Python on Windows makes a distinction between text and binary files; the end-of-line characters in text files are automatically altered slightly when data is read or written. This behind-the-scenes modification to file data is fine for ASCII text files, but it’ll corrupt binary data like that in JPEG or EXE files. Be very careful to use binary mode when reading and writing such files. On Unix, it doesn’t hurt to append a 'b' to the mode, so you can use it platform-independently for all binary files.

关于python - Python 中的 MD5 和 SHA-2 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5787471/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com