2 回答
TA贡献1780条经验 获得超3个赞
不,32 位 CRC 太容易冲突了。考虑比较 CRC 和大小(最好还比较压缩大小和压缩方法)-如果所有 4 个都相同,则可以安全地假设相同的文件。
但是,您对“重复”的定义是什么?
两个图片文件可以具有相同的有效负载(实际照片)但具有不同的元数据(标题、评论...) - 在这种情况下,您需要自己对文件的部分进行哈希处理,因此元数据将被忽略。
两个图片文件可以描绘同一场景,但具有不同的尺寸(即 800x600 与 1600x1200)或不同的压缩(有损、无损、隔行...) - 在这种情况下,您必须直观地解释它们。
两个图片文件可能会导致呈现相同的显示,但具有不同的格式(即 PNG、TIFF、JPEG、WEBP...) - 在这种情况下,您需要比较它们的呈现位图。
如您所见:提取/解压缩文件将使您能够更精确地操作,首先使用您最喜欢的软件来检测重复项。
TA贡献1765条经验 获得超5个赞
两阶段方法
据我所知,CRC 是一个 32 位无符号整数(4,294,967,295 个值)。对于较大的文件,例如图像,我们可以假设它具有平坦的随机分布。我会将它与 the 结合起来size以获得一个唯一的字符串:
$stat = $zip->statIndex($index);
$str = $stat["crc"] . $stat["size"];
如果所有 ZIP 文件的压缩方法都相同,您可以添加压缩大小:
$stat = $zip->statIndex($index);
$str = $stat["crc"] . $stat["size"] . $stat["comp_size"];
这将使得两个不同的图像产生相同的字符串的可能性很小,但就像真正的散列一样,仍然有一个非常小的变化,它将为两个不同的图像返回相同的字符串。
我不认为这是可以接受的。
但是,如果两个图像返回相同的字符串,您仍然可以更仔细地检查它们以检查它们是否确实相同。您可以从一个更好的hashes 开始,但为什么不简单地进行逐字节比较呢?通过这种方式,您实际上可以绝对确定图像的独特性。
当然,这会比仅仅依靠统计数据慢,但我认为你必须同意这比对错误识别的图像进行很小的更改要好。
所以在这里我的方法是做的一个粗略的检查crc和size第一。如果这些相同,那么我实际上会比较这些文件以确保它们确实相同。这样我就不会假设两个图像是相同的,因为它们的crs/size's 是相同的,而当它们不同时。
- 2 回答
- 0 关注
- 271 浏览
添加回答
举报