哪种压缩文件类型比较好?

7z的压缩比最高。1.目录和卷

抛开压缩算法,我觉得zip和rar在文件格式上最大的区别在于目录(TOC): ZIP有TOC,rar没有。

其实TOC这个词是从出版业借来的,指的是每本书正文前面的“目录”。它的作用是世界上所有人都知道的:如果你想快速找到一本书的某个内容,可以先查找,然后根据TOC指定的页码直接翻。

在纸质书里,TOC是打印出来的表格,而在电子文件里,是由结构化数据组成的表格。它的目的也是为了快速定位:如果你想在一个文件中找到什么,可以先查TOC,知道感兴趣的内容在文件中的什么位置,跳过就行了。最常见的应用是avi、rm等多媒体文件:播放时经常有人在播放栏上跳来跳去(也就是“随机存取”)。如果没有TOC,在几百兆长的文件中来回定位会很慢。

具体到zip文件,TOC是放在文件末尾的一个表,它列出了属性(文件名、长度等。)及其在zip包中的存储位置。如果需要随机访问zip包中的一个文件,只需要在TOC中找到这个文件的存储位置,直接跳过即可。

但是,RAR文件中没有TOC,所有文件都按顺序存储在文件头之后。

这种差异的结果就是随机访问时zip比rar快,而顺序访问时rar比zip快。

所谓随机访问,就是对上面提到的压缩包中指定文件的随机访问。举个简单的例子:一个反编译或者下载的web电子书,里面有很多HTML、图片、css和js,然后打包成压缩包。现在要求访问页面不需要解包:你可以想象一下,当你打开每一个HTML页面的时候,图片、css、js等附加文件可能会随机分布在整个压缩包中。如果没有TOC,从头开始查找每个文件会很慢。所以你可以理解为什么jar包是标准的zip包,我只用zip格式来保存反编译的电子书,漫画,PDG的书和一切可能需要随机访问的东西。

所谓顺序访问,就是把整个压缩包从头到尾解包。RAR在这方面有天然的优势。而且为了节省WinRAR列文件的时间,我一般都是直接通过右键菜单解压单个RAR,很少双击压缩包打开再解压。

由于rar的原作者已经去世,我相信这种差异的确切原因无从考证,但我个人猜测可能与DOS时代的备份软件之争有关:在DOS时代,电脑硬盘没有现在这么奢侈,20MB已经很大了。这个容量可以用两盒软盘备份,相对于数据本身的价值,备份成本非常低。所以在DOS时代,很多公司和机构都建立了定期的硬盘备份政策,以避免由于人为或非人为因素造成的不可挽回的数据丢失(早期的硬盘可能没有现在这么可靠)。在备份软件方面,虽然微软已经提供了带DOS的BackupRestore工具,但是基本不具备数据压缩的能力,所以在压缩软件中提供备份功能已经成为DOS时代的一种时尚。由于DOS时代的备份介质多为软盘,压缩软件的备份功能实际上转化为现在很常见的功能:卷压缩功能,即根据软盘的容量进行卷压缩,然后将卷压缩后的文件备份到软盘,必要时进行解压缩,或者恢复到硬盘。

DOS时代最著名的压缩工具是pkzip,比RAR的DOS版本出现的早。在卷压缩期间,pkzip根据zip文件规范将TOC存储在末尾,即最后一个卷中,这会带来以下问题:

1.恢复时,每次解压磁盘,都要先插入最后一张磁盘,读取TOC一次。

2.只要最后一个磁盘上的TOC坏了,就算其他磁盘都好,也无法正常解压。

这两个缺点,尤其是第一个,是如此臭名昭著,以至于有一个非常强烈的改革呼声。就在这个关键时刻,RAR的DOS版出现了:不仅压缩比高于pkzip(这在DOS时代很重要,毕竟软盘价格贵,容量小),而且由于当时对zip格式的批评,TOC也被取消了,所以:

1.恢复按卷压缩的备份文件时,不必频繁插入带TOC的卷,按顺序换盘即可。

2.即使卷被损坏,您也可以跳过它,从完好的卷开始解压缩。

由于这些原因(当然也有其他原因),RAR推出后迅速取得成功,pkzip在DOS时代开始流失用户,在Windows时代基本销声匿迹。Windows时代推出的Winzip,完全放弃了分卷压缩的功能(zip格式总是伤人?)。从我看过的WinRAR的UnRAR源代码来看,很明显WinRAR的解压思路是把文件从头到尾按顺序解压。看来那些年备份恢复工具之争的影响真的很深远。

二、固体压缩模式

压缩算法方面,我觉得rar格式最有特点的就是立体压缩。WinRAR v3.42的帮助文件中对固态压缩的描述如下:

固态压缩文件是一种以RAR特殊压缩模式存储的压缩文件,它将压缩文件中的所有文件视为一个连续的数据流。

这个解释其实揭示了固体压缩格式可以提高压缩比的奥秘:数据压缩的基础是“重复”,比如字符串aaaabbb,就包含了重复。如果表达成a4b3,是不是看起来更矮?这就是“数据压缩”。“重复”是一个具有相对意义的概念。如果在某个范围内似乎没有重复或者重复很少,我们可能通过扩大范围找到更多的重复数据,这就是固体压缩的奥秘。

举个简单的例子:用zip和普通rar压缩一堆jpg文件比较困难,但是用solid rar可以压缩。原因是jpg文件已经是压缩格式了,很难在单个jpg文件中找到可用的重复数据,所以很难用zip或者普通的rar进行压缩,因为它们都是把需要压缩的文件分离出来,逐个处理。但是对于solid rar来说,所有需要压缩的jpg文件都是整体压缩的,这些jpg之间存在重复数据,比如它们都有相同的文件头(包括各种数据表),这就导致了可压缩的空间。从我看到的资料来看,Flash文件也是用类似的技术压缩jpg:如果Flash文件中使用了多个jpg文件,可以使用一个头。

当然,世界上不会有免费的午餐。固体压缩方法在提高压缩比的同时也有一些局限性。在WinRAR v3.42帮助文件中说:

固体压缩可以提高压缩性能,尤其是在添加大量小文件时,但它也有一些重要的缺点。

更新现有的实体压缩文件很慢;

当从一个实体压缩文件中提取单个文件时,需要首先分析它之前的所有文件。这使得从固态压缩文件中取出文件比普通压缩文件要慢。但是,当所有文件都从固态压缩文件解压缩时,解压缩速度没有影响。

如果固态压缩文件中的任何文件损坏,则无法从损坏的范围中解压缩所有文件。因此,如果固态压缩文件存储在软盘等介质中,建议您在制作时使用“恢复记录”。

固体压缩的适用场合如下

压缩文件很少更新时;

不需要频繁地从压缩文件中提取文件或文件的一部分;

当压缩效率比压缩速度更重要时。

与上面提到的“随机访问”相对应,一个固态压缩的RAR文件可能是世界上最不适合随机访问的:如果你需要访问一个固态RAR包中的文件,你必须从文件头开始解压,直到到达这个文件。

第三,安全

这里的安全包括几层含义:文件系统安全、密码保护安全和文件数据安全。

由于在制定zip格式规范时,操作系统本身的文件安全性还没有引起足够的重视,所以zip格式只记录了最基本的文件属性,包括只读属性,没有其他额外的安全属性。

刚推出rar格式的时候,文件系统的安全性只能参考DOS,类似于zip。但是rar毕竟是封闭格式,怎么改由作者自己决定。所以在Windows出现NTFS,引入扩展文件系统安全属性的时候,rar也积极跟进,所以现在应该说rar格式在这方面比zip更胜一筹。

zip和rar两种格式都提供密码保护,只是密码保护的安全强度不同。

由于zip的开放格式和开源代码,zip密码破解软件出现的更早也更多。刚开始以暴力破解为主,威胁不大。对zip密码安全性真正致命的打击是已知的明文攻击方法:如果知道加密zip文件中某段内容(密文)的解密真实内容(明文),就可以推导出加密zip密码。在这种攻击方式的威胁和一些国家的法律对加密技术的限制下,著名的开源组织zlib宣布永远放弃对加密zip的支持。详见zlib网站上的相关说明(虽然在zlib公布的源代码中仔细查找还是能找到原始的加密解密相关代码)。

记得刚推出rar的时候,和zip是一样的。虽然无法列出加密文件的内容,但可以列出加密文件中的文件名。后来大概是被已知的明文攻击吓到了,加了一个“加密文件名”选项,连加密的rar文件里的文件都看不到,让攻击者无法猜出明文。

Rar格式比zip推出的晚,在安全方面已经吸取了足够多的教训。因此,采用美国国家标准与技术研究院(NIST)推荐的AES对称加密算法,密钥长度为128位。在ASE被攻破之前(NIST认为30年内不可能被攻破),大家只能在暴力法上兜圈子,所以密码安全性应该说是高于zip的。WinRAR 3.42的帮助文件描述如下:

ZIP格式使用私有加密算法。RAR压缩文件使用更强大的AES-128标准加密。如果需要加密重要信息,最好选择RAR压缩文件格式。为了确保安全,密码应该至少有8个字符长。不要使用任何语言的单词作为密码。最好是字符和数字随机组合,注意密码的大小写。记住,如果你丢失了密码,你将无法取出加密文件,甚至连WinRAR的作者本人也无法解压加密文件。

在数据安全方面,RAR格式本身支持一种特殊类型的附加信息,称为“恢复记录”。如果RAR文件有恢复记录,当介质物理损坏或其他原因导致数据丢失时,WinRAR可以根据“恢复记录”尝试修复数据。Zip格式没有恢复记录,所以应该说在数据安全性上比RAR弱。

虽然RAR文件本身支持恢复记录,但是在WinRAR中这个选项是默认关闭的,开启后压缩后的RAR文件体积会增大(增大的百分比和设置有关),可能会让一些人觉得不习惯(我个人在论坛上看到有人抱怨为什么压缩后的RAR文件这么巨大),所以这个功能基本没用。

第四,开放性

开放的反差显而易见:zip格式不仅在文件格式上完全开放,而且有专门的开源组织提供运营源代码,跨平台使用也没有太大限制;Rar格式是完全保密的,作者只提供解压需要的源代码,不提供压缩需要的,所以跨平台使用有点麻烦。

在Zip的开源组织中,最著名的是zlib和InfoZip,两者各有侧重:zlib强调内存缓冲区的压缩,所以被png等开源组织作为内部压缩算法,甚至java的jar内核都来自zlib,所以类型化的jar包自然是标准的zip文件;InfoZip侧重于文件的操作(包括密码保护),应用似乎没有zlib广泛,但我个人认为其实还是挺有用的,前提是需要对其源代码进行一些必要的修改。

png组织的网站里提到了png格式的历史,我觉得也很有意思。其实做png的一群人都在做gif格式的。但由于Unisys公司开始对gif格式的核心——LZW压缩算法收取专利费,这些人愤怒了,干脆提出png格式:大结构还是采用分段结构,但核心压缩算法采用开源的zlib,大多数情况下压缩效果强于gif LZW。由于没有版权限制,png在静态图形领域得到了广泛的应用。如果不是及时提出动画支持,在网络上流行起来,我估计gif早就死了。

其官网www.rarlab.com上提供了RAR的解压源代码,通常比WinRAR正式版晚一点,但据说是直接从WinRAR源代码中提取的,所以兼容性应该没有问题。

动词 (verb的缩写)结论

以下观点纯属个人观点,仅供参考,无指导意义:

如果经常需要随机访问压缩包,应该选择zip而不是rar。虽然把下载的rar重新压缩成zip一次会比较麻烦,但是以后会减少无数麻烦。

如果需要卷压缩(比如有些网站对上传文件的大小有限制),只能用rar。事实上,这是我唯一会使用rar格式的场合,其他时候,zip是没有商量余地的。