Zip文件的校验和

8
我目前正在开发一个工具,它可以上传一组文件,然后使用md5校验和来比较这些文件与上一次上传的批次,并告诉您哪些文件已更改。
对于常规文件,这个工具运行良好,但一些上传的文件是zip归档文件,即使其中的文件相同,也几乎总是会更改。
有没有一种方法可以执行不同类型的校验和来检查这些zip文件是否已更改,而无需单独解压缩每个文件,然后逐个比较每个文件的内容。
以下是我的当前功能:
function check_if_changed($date, $folder, $filename)
{
  $dh = opendir('./wp-content/uploads/Base/');
  while (($file = readdir($dh)) !== false) {
    $folders[] = $file;
  }
  sort($folders);
  $position = array_search($date, $folders);
  $prev_folder = $folders[$position - 1];
  if ($prev_folder == '.' || $prev_folder == '..')
    { return true;}
  $newhash = md5_file('./wp-content/uploads/Base/'.$date.'/'.$folder.'/'.$filename);
  $oldhash = md5_file('./wp-content/uploads/Base/'.$prev_folder.'/'.$folder.'/'.$filename);
  if ($oldhash != $newhash){
    return true;
  }
  return false;
}
2个回答

9
在zip存档中,每个“文件”都带有元数据,例如最后修改时间、文件名、以字节为单位的文件大小等等,以及重要部分-一个crc32校验和。
基本上,您可以以二进制方式操作zip存档,找到每个文件的元数据头,并将校验和与先前存储的校验和进行比较。您不需要解压缩任何内容即可访问zip存档中的元数据。这将非常快速。

http://en.wikipedia.org/wiki/Zip_(file_format)

编辑- 实际上,ZipArchive提供了这个功能。请参见: http://www.php.net/manual/en/ziparchive.statindex.php

OT:Python的zip库可以让你获取zip文件中的crcs,你也可以使用binascii模块来计算任意数据的crc。 - Stuart Axon
看起来校验和是 crc32b,可以在 64 位机器上通过 $newCrc = hexdec(hash_file("crc32b", "myPath/" . $name)); 生成。 - Dimitry K

0

你可以仅提取ZIP文件的文件部分,然后对它们进行哈希处理,但是这样你也必须删除元信息!

因此,提取文件确实是最简单的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接