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