压缩工具选型之zip、rar、tar/tar.gz、7z对比
为统一部署软件打包格式,进行压缩打包格式的选型。
目前市面常见的压缩格式有zip、rar、tar/tar.gz、7z等。
tar/tar.gz:
1979 年 1 月的一个清晨,Tar 实用程序首次作为 Unix V7 的一部分正式面世。Tar 程序当时主要被设计为往磁带上批量高效写入文件的一种方式。现在,虽然现在大多数 Linux 用户都已经不知道磁带驱动器是什么鬼了,但 tarballs(tar 的昵称)仍被常用于将多个文件甚至整个目录树打包到单一文件当中。
需要 Linux/Unix 用户注意的是,普通的 tar 格式文档只进行归档操作而不进行压缩。换句话说就是,如果你 tar 100 个 50kb 的文件得到的 tar 归档文件大小应该为 5000kb 左右。
使用 Tar 进行文件归档的唯一好处就是减少某种粒度磁盘空间的分配。(例如在簇大小为 4kb 的磁盘上 1 字节的文件也要占用 4kb 磁盘空间,若有 1000 个 1 字节的文件分散在此磁盘上的话,则会占用 4MB 大小,而使用 Tar 归档之后则只占用 1MB 左右大小。)
值得一提的是,tar 并非 Linux/Unix 中创建归档文件的唯一方式。程序员朋友应该知道 ar,它大多情况下主要用于创建静态库,实际它也是可用来创建其它种类归档的,例如 Debian 系统中使用的 .deb 包文件就是 ar 存档。而 macOS 的 mpkg 包是使用 gzip 压缩的 cpio 档。不过 ar 和 cpio 用起来不像 Tar 这样友好、简单,所以 tar 的受欢迎程度更高,普及更广。
虽然归档是种不错的选择,但随着时间的推移和个人 PC 时代的到来,人们意识到可通过压缩数据的方式来大量节省存储成本。所以 10 年后随 MS-DOS 出现的 zip 文档便是支持压缩的归档格式,zip 最常见的压缩方式是采用 LZ77 算法 实现的 deflate。由于它由 PKWARE 商业开发,所以 zip 格式也受专利保护多年。因此,为不侵犯到 PKWARE 的专利,同样采用 LZ77 算法的 gzip 格式被推出并广泛使用。
Unix 的哲学就是 把某事做到最好 ,所以 gzip 只被设计为压缩文件。因此,为了创建压缩归档,必需先使用 tar 创建归档,之后再对归档文件进行压缩,因此才有了 .tar.gz 文件(为遵循 8.3 MS-DOS 文件名称限制,又被简称为.tgz)。
随着技术的不断发展,具有更高压缩比的压缩算法也一一被实现,例如:在 bzip2 中实现的 Burrows-Wheeler 算法 (.tar.bz2 存档)和 LZMA 算法 实现的 .xz 存档。
ZIP:
1985年一家名为SEA(System Enhancement Associates,系统增强伙伴)的小公司开发了一个在MS-DOS平台下的商业压缩软件,名为ARC。当时的软件发行方式略有不同,用户购买了软件,除了得到软件的可执行文件还包括一份C语言的源代码。当时的卡茨与很多用计算机的平民一样,缺乏资金购买大量的商业软件,当时卡茨从网上下载了一份ARC的C语言源代码,并用汇编语言将其全新编写并编译出来。卡茨将这个软件命名为:PKARC(Phillip Katz' ARC)。卡茨制作的新软件PKARC因为是参照源代码编写的,所以完全兼容ARC并且性能上比ARC高。卡茨当时将这个新软件上传到网络上面。显然,卡茨此举造成对SEA公司的侵权。SEA最初希望通过联络卡茨使PKARC成为SEA公司旗下的一款产品,后来卡茨拒绝了。最终,双方对簿公堂,结果是卡茨败诉,卡茨被判以对SEA公司的赔款以及停止发放PKARC。后来,卡茨在研发过程中的PKARC续作也被迫重新改写所有代码,PKARC其实就是下文提及的PKZIP的前身
这场官司过后几周,卡茨就制作出新压缩软件PKZIP(Phillip Katz' ZIP),这款全新的软体比ARC的压缩率、压缩性能都要高许多,并且包含更多功能。此后,卡茨还将ZIP的所有技术参数公诸于众。ZIP(含义“速度”)这一名称是由卡茨的朋友罗伯特·马宏利(Robert Mahoney)建议的。他们想暗示,他们的产品比ARC在一定时间内更快速。这个名字往往被写成大写字母,因为在DOS系统内,通常都是使用大写字母作为后缀名的。(由于MS-DOS运行在FAT文件系统上)
因格式开放且免费。越来越多的软件内嵌支持打开Zip文件。这时,Zip文件越来越像一个经过压缩的透明文件夹。
自Windows Me以来,Windows内嵌支持打开以及压缩Zip文件。
一些下载软件的工具,支持部分下载Zip文件然后进行恢复。
越来越多的软件内嵌支持打开Zip文件。
几乎所有的压缩软件都支持打开及制作Zip文件。
由于出现于市场的时间早,今日Zip文件与其他压缩格式相比有众多无法忽视的缺点。
原生并不支持Unicode文件名称,容易导致一部分的资源共享困难,在东亚文化圈的资源交流尤其显著;无法与7z相比的压缩比率以及如WinRAR的Recovery Record修复支持功能的缺乏亦都是其衰微的原因。
RAR:
RAR 是一种专有的文件格式,用于文件的压缩、归档与打包。RAR 的全名是:Roshal Archive(即“罗谢尔的归档”之意),其开发者是尤金·罗谢尔(Eugene Roshal)。首个公开版本 RAR 1.3 发布于1993年。Roshal 最初编写了 RAR 的 Dos 版本的程序用以编码和解码文件,后来该程序被移植到其他的平台,比较著名的是 Windows 平台上移植版的 Win RAR。Eugene Roshal后来公开了解码程序的源代码,但是编码程序仍然是私有的。RAR 因为其独特的压缩算法,基本可以做到无损压缩,而且还能够满足较高的压缩比,同时保证一定的压缩速度。但是RAR压缩算法也存在一定的缺陷,由于RAR文件头需要占用一部分的空间,二档压缩的原始数据量较小,而且压缩的空间较小的情况下,可能会出现压缩后的文件反而比原始文件更大。RAR 文件有较多的冗余记录,主要是考虑到在压缩过程中,压缩数据受损,为了保证无损压缩,会有较多的恢复记录,这些恢复记录也占用了一定的空间。但是分卷压缩是 RAR 非常突出的一个优点,将源文件分割为多个小文件,从而有利于解压出源文件。如果将所有的数据压缩到同一个数据区,就可以大大加大压缩比,但是这种压缩方式在解压其中一个单独的文件时就必须解压同一数据区中位于它之前的所有的文件,不利于文件的单独解压。RAR 拥有成熟的加密算法,2.0 版本以后使用 AES 算法来加密,AES 算法的破解难度比较大,在没有密码的情况下只能采取暴力破解的办法,对于数据的安全性有一定的保证。
RAR 文件格式是专有的压缩文件格式,其具体的设计细节并没有完全公开。其最初用于DOS,后来移植到其它平台。主要的Windows版本编码器,称为WinRAR,以共享软件的形式发行。不过罗谢尔公开了解码器源码,UnRAR解码器许可证以不许发布编译RAR兼容编码器为条件下允许有条件自由发布与修改,而RAR编码器一直是有专利的。
RAR通常情况比ZIP压缩比高,但压缩/解压缩速度较慢。
分卷压缩:压缩后分割为多个文件。
固实压缩:把要压缩的视为同一个文件以加大压缩比,代价是取用包中任何文件需解压整个压缩包。
恢复记录:加入冗余数据用于修复,在压缩包本身损坏但恢复记录够多时可对损坏压缩包进行恢复。
加密:RAR 2.0使用AES-128-cbc,(rar5.0以后为AES-256CBC)。之前RAR的加密算法为私有。目前均未被直接攻破(至少没有公开),没有密码时只有暴力破解。 [1]
缺点:无法有效对付嵌套压缩包,对于密码各异的压缩包WinRAR无法批量处理,对于指定路径中的压缩包不能自动解压,处理大块头压缩包速度缓慢。
7z:
7z格式和前文中的Zip格式一样,当前主流的第三方App基本都能打开或创建 7z格式的文件。此格式是Zip格式的升级版,是压缩格式中的后起之秀,压缩率也非常高,有些7z格式的相关软件在收费方面比rar格式的还要高不少。所以即使继承和发展了Zip格式的人气,也在现实中难超越rar 和zip的地位。
对比:
1、从压缩率来说
7z > RAR > ZIP ≈ tar.gz
2、从普遍性来说
a.zip格式是最广泛的,win系统和Mac系统在不装第三方App的情况下,是可以打开zip压缩文件的,这也是其他压缩格式所不具备的优势。
b.Rar格式虽然以很高的压缩率闻名于世,但由于其并不免费,部分用户还是在免费区潜水,而且此格式的创建非收费软件不可,更是让人望而却步。
c.7z格式完美的继承了Zip的优点,例如强大的曝光力度,被大多数软件兼容,而且在压缩率上有了很大的进步,甚至可以超越Rar,但是使用此格式不一定免费。
d.tar.gz格式与zip相差不大,在linux系统中应用广泛,不过在其他系统中则需要安装相应工具
由上可知,大多数用户还是优先考虑zip、7z格式。因为我们并不知道对方是否有相应的解压工具,例如BetterZip等工具来解压缩Rar文件。
3、压缩速度
高的压缩率是大体量文件的追求,但高的压缩率会以压缩时间为代价。对于Zip、Rar、7z三种格式来说,Rar和7z旗鼓相当,tar.gz需要两步操作,而Zip就非常快了。
最终结论:
压缩率方面,各软件其实相差不算离谱,优势并不明显
部署平台有跨平台的需求,普遍性的要求更高,使用zip有优势
压缩速度方面,zip占优,在部署解压文件时更具优势
故此,最终确定为zip格式。