是否有任何外部工具可以为gzip -lv提供匹配的校验和?

时间:2010-12-10 18:32:41

标签: gzip md5 checksum crc crc32

当给出-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文件通常具有不同的md5sum(由于时间戳或所有者,这在此应用程序中无关紧要)。我注意到gzip将为内部数据提供校验和,因此对于两个gzip文件,我可以简单地比较校验和加上大小的列表。

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

2 个答案:

答案 0 :(得分:2)

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

所以使用jacksum。 :)

调用:jacksum -a crc32 filename

答案 1 :(得分:1)

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

此基准测试是在由cat /dev/urandom生成的4-gig文件上的VirtualBox Ubuntu VM中执行的。你可能会在“真正的”机器上获得更好的速度,但它们的比例应该相同。

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是我的答案。