【发布时间】:2010-12-31 21:50:17
【问题描述】:
采用 MD5 和是否仍然适合检查文件重复?我知道它不安全,但是在尝试查找文件重复的情况下这真的很重要吗?
我应该改用 SHA 系列中的东西吗?
这个用例的最佳实践是什么?
【问题讨论】:
标签: language-agnostic md5 checksum duplicate-data sha
采用 MD5 和是否仍然适合检查文件重复?我知道它不安全,但是在尝试查找文件重复的情况下这真的很重要吗?
我应该改用 SHA 系列中的东西吗?
这个用例的最佳实践是什么?
【问题讨论】:
标签: language-agnostic md5 checksum duplicate-data sha
SHA1 作为校验和略好于 MD5。这是 Git 使用的。
【讨论】:
此时 MD5 存在已知漏洞,但这对您的应用程序来说可能不是问题。它仍然可以很好地区分成堆的比特。如果出现不匹配的内容,那么您知道您还没有看到它,因为该算法是确定性的。如果某些东西作为匹配返回,您实际上应该将其与表面上匹配的 blob 进行比较,然后再将其视为真的重复。 MD5 相对较快,但如果您无法对哈希冲突进行全文比较,您可能应该使用更强的哈希,例如 SHA-256。
【讨论】:
在这种特殊情况下,算法的选择可能并不那么重要。使用 SHA1 而不是 MD5 的关键原因都与创建加密安全签名有关。
MD5 对于这项任务应该是完全可以接受的,因为您可能不需要担心有人恶意制作文件以生成虚假副本。
【讨论】:
虽然 MD5 确实有一些冲突,但我一直将它用于文件并且它工作得很好。
【讨论】:
出于描述的目的,没有真正可取的解决方案,两种哈希函数都可以解决问题。无论如何,MD5 通常会比 SHA1 稍快。
python中的示例:
#!/usr/bin/env python
import hashlib, cProfile
def repeat(f, loops=10000000):
def wrapper():
for i in range(loops): f()
return wrapper
@repeat
def test_md5():
md5 = hashlib.md5(); md5.update("hello"); md5.hexdigest()
@repeat
def test_sha1():
sha = hashlib.sha1(); sha.update("hello"); sha.hexdigest()
cProfile.run('test_md5()')
cProfile.run('test_sha1()')
#
# 40000004 function calls in 59.841 CPU seconds
#
# ....
#
# 40000004 function calls in 65.346 CPU seconds
#
# ....
【讨论】:
您所说的是校验和,它与加密哈希相关(但不相同)。
是的,只要您不担心恶意用户故意制作具有相同校验和的两个不同文件,MD5 甚至 CRC 都可以作为校验和正常工作。如果这是问题,请使用 SHA1,或者更好的是,使用一些 cryptographically unbroken 哈希。
【讨论】:
如果您关心性能,我认为最好先检查匹配的文件大小,然后使用快速哈希函数(CRC32 或 MD5,它应该比 SHA1 更快)并尝试使用 MD5 以这种方式找到可能的重复文件、SHA1 或 SHA256(取决于任务的关键性)。
【讨论】:
我们在工作中使用 MD5 来满足您的需求。效果很好。我们只需要在每个客户的基础上检测重复上传,这减少了我们对birthday problem 的曝光,但是如果我们必须检测所有上传而不是每个客户的重复,md5 对我们来说仍然足够。如果您可以相信互联网,给定 n 个样本和 b 的哈希大小的碰撞概率 p 为:
p <= n (n - 1) / (2 * 2 ^ b)
几年前,我计算了 n = 10^9 和 b = 128,得出了 p
【讨论】: