为了账号安全,请及时绑定邮箱和手机立即绑定

PHP:来自 ZipArchive::statIndex() 的 CRC 是否足够独特以用于检测许多

PHP:来自 ZipArchive::statIndex() 的 CRC 是否足够独特以用于检测许多

PHP
萧十郎 2021-08-28 14:37:54
如果我有多个 zip 文件并且我遍历每个 zip 文件的内容以查找唯一文件,那么对于不同 zip 中的同一个文件,CRC 值是否相同?ZipArchive 上的statindex方法返回一个数组,如下所示:Array(    [name] => foobar/baz    [index] => 3    [crc] => 499465816    [size] => 27    [mtime] => 1123164748    [comp_size] => 24    [comp_method] => 8)老实说,文件大小可能足以满足我的需求,但为了安全起见,我一直在寻找另一种检测唯一性的方法。据我所知,唯一的替代方法是提取然后使用文件哈希方法,但这比仅使用 ZipArchive 类提供的内容要慢得多。就我而言,我有一个由 30,000 个 zip 构建的大约 230,000 张图像的目录,每个 zip 中有大约 30 张图像,我想创建一个数据库,其中包含哪些图像来自哪个 zip,我知道会有很多重复。
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

不,32 位 CRC 太容易冲突了。考虑比较 CRC 和大小(最好还比较压缩大小和压缩方法)-如果所有 4 个都相同,则可以安全地假设相同的文件。

但是,您对“重复”的定义是什么?

  • 两个图片文件可以具有相同的有效负载(实际照片)但具有不同的元数据(标题、评论...) - 在这种情况下,您需要自己对文件的部分进行哈希处理,因此元数据将被忽略。

  • 两个图片文件可以描绘同一场景,但具有不同的尺寸(即 800x600 与 1600x1200)或不同的压缩(有损、无损、隔行...) - 在这种情况下,您必须直观地解释它们。

  • 两个图片文件可能会导致呈现相同的显示,但具有不同的格式(即 PNG、TIFF、JPEG、WEBP...) - 在这种情况下,您需要比较它们的呈现位图。

如您所见:提取/解压缩文件将使您能够更精确地操作,首先使用您最喜欢的软件来检测重复项。


查看完整回答
反对 回复 2021-08-28
?
POPMUISE

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 是相同的,而当它们不同时。


查看完整回答
反对 回复 2021-08-28
  • 2 回答
  • 0 关注
  • 271 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信