$ 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
是否有任何外部工具可以导出相同的校验和?
md5sum
,cksum
和sum
填写类似的角色,但不提供匹配的代码(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时间的瓶颈。
答案 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是我的答案。