【发布时间】:2013-02-08 07:47:31
【问题描述】:
我有一个存储库,用于存储我的所有图像文件。我知道有很多重复的图像,我想删除每一个重复的图像。
我想如果我为每个图像文件生成校验和并将文件重命名为其校验和,我可以通过检查文件名轻松找出是否有重复的。但问题是,我无法确定选择要使用的校验和算法。例如,如果我使用 MD5 生成校验和,我是否可以完全相信校验和是否相同,这意味着文件完全相同?
【问题讨论】:
我有一个存储库,用于存储我的所有图像文件。我知道有很多重复的图像,我想删除每一个重复的图像。
我想如果我为每个图像文件生成校验和并将文件重命名为其校验和,我可以通过检查文件名轻松找出是否有重复的。但问题是,我无法确定选择要使用的校验和算法。例如,如果我使用 MD5 生成校验和,我是否可以完全相信校验和是否相同,这意味着文件完全相同?
【问题讨论】:
从安全论坛 (https://security.stackexchange.com/a/3145) 中对类似问题的回复来看,碰撞率约为每 2^64 条消息 1 次碰撞。如果您的文件不同,并且您的收藏量不大(即接近这个数字),则可以安全地使用 md5。
另外,请参阅此处对非常相似的问题的回复:How many random elements before MD5 produces collisions?
【讨论】:
为 2 个不同的文件获得相同校验和的可能性非常小,但不能绝对保证 (Pigeonhole principle)。一个迹象表明 GIT 对包括 Linux 在内的软件开发源代码使用 SHA-1 校验和并且从未引起任何已知问题,所以我会说你是安全的。我会使用 SHA-1 而不是 MD5,因为如果你真的很偏执,它会稍微好一些。
【讨论】:
为了确保您最好遵循两步程序:首先计算每个文件的校验和。如果校验和不同,您确定文件不相同。如果您碰巧发现一些具有相同校验和的文件,则无法进行逐位比较以 100% 确定它们是否真的相同。这与使用的散列算法无关。
您将节省大量时间,因为对每对可能的文件进行逐位比较将花费很长时间和一天的时间,而比较一手可能的候选人则相当容易。
【讨论】: