1

当给定 -l 和 -v 选项时,gzip 将给出每个文件的校验和,如下所示:

$ echo foo > foo
$ gzip foo
$ gzip -lv foo.gz
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 7e3265a8 Dec 10 17:37                  28                   4 150.0% foo

是否有任何外部工具可以用来导出相同的校验和?

md5sumcksumsum填写类似的角色,但不给出匹配代码(3915528286的十六进制为e962385e)。

$ echo foo > foo
$ md5sum foo
d3b07384d113edec49eaa6238ad5ff00  foo
$ cksum foo
3915528286 4 foo
$ sum foo
00106     1




申请的额外细节:


我们有一个包含许多大文件的文件系统,并且不断地复制新文件。一些传入的文件匹配已经存在的文件,在这种情况下,我们想简单地硬链接预先存在的文件,以节省磁盘空间。对于解压后的文件,md5sum 帮助我们快速有效地进行比较。另一方面,gzip'd 文件对于相同的数据通常具有不同的 md5sum(由于时间戳或所有者,这与此应用程序无关)。我注意到 gzip 将为内部数据提供校验和,因此对于两个 gzip 文件,我可以简单地比较校验和列表以及大小。

我还想支持将 gzip 文件与“普通”文件进行比较,在这种情况下,我需要一个实用程序,它可以从 gzip 外部生成相同的校验和。我想简单的解决方案是在比较之前总是 gzip 纯文件,但这是我想避免的开销,因为我们的系统目前受到 CPU 时间的瓶颈。

4

2 回答 2

3

长话短说,我浏览了 gzip 的源代码,将其与 cksum 的源代码进行了比较,进行了一些修改,然后发现 jacksum 使用与 gzip 相同的实现。

所以使用jacksum。:)

调用:jacksum -a crc32 文件名

于 2010-12-11T18:28:32.453 回答
2

我刚刚运行了一些基准测试,虽然 jacksum 相当不错,但它比 cksfv 需要更长的时间并且使用更多的内存。

该基准测试是在 VirtualBox Ubuntu VM 上对由cat /dev/urandom. 您可能会在“真实”机器上获得更好的速度,但它们的比例应该相同。

gzip/tempfile 方法耗尽了磁盘空间,但我不在乎,因为它已经使用了两倍以上的时间。

$ cksum random.dat
1591530146 4388388864 random.dat
5.78user 7.42system 2:53.62elapsed 7%CPU (0avgtext+0avgdata 2896maxresident)k
8480936inputs+0outputs (0major+225minor)pagefaults 0swaps

$ md5sum random.dat
3d6f60f84b2289992abd66428e8a73c4  random.dat
5.57user 8.25system 2:25.97elapsed 9%CPU (0avgtext+0avgdata 2656maxresident)k
8480960inputs+0outputs (1major+209minor)pagefaults 0swaps

$ jacksum -x -a crc32 random.dat
c93b4e20        4388388864      random.dat
3.65user 10.82system 2:19.69elapsed 10%CPU (0avgtext+0avgdata 52224maxresident)k
8490688inputs+152outputs (60major+3936minor)pagefaults 0swaps

$ cksfv random.dat
; Generated by cksfv v1.3.14 on 2010-12-11 at 12:06.31
; Project web site: http://www.iki.fi/shd/foss/cksfv/
;
;     93421568  11:16.12 2010-12-11 random.dat
random.dat C93B4E20
4.42user 8.65system 2:14.42elapsed 9%CPU (0avgtext+0avgdata 2048maxresident)k
8480944inputs+0outputs (1major+171minor)pagefaults 0swaps

$ bash -c gzip -c random.dat > temp.gz && gzip -lv temp.gz

gzip: stdout: No space left on device
Command exited with non-zero status 1
55.54user 6.68system 4:31.56elapsed 22%CPU (0avgtext+0avgdata 4992maxresident)k
2596536inputs+2689840outputs (3major+695minor)pagefaults 0swaps

我认为cksfv是我的答案。

于 2010-12-11T20:25:24.843 回答