Files
Knowledge/其他/压缩的二三事.md
T

2.4 KiB

压缩包,其实干了两件事:打包(专业说法叫归档)和压缩。

.rar 是一种专利格式,它既是一种打包,也包含了压缩。

.zip 类似,既是打包,也是压缩。但它是开源的,并且在开源历史上一个重要的里程碑。最早它用的压缩算法叫 Deflate(当然现在也支持了很多其它算法)。基本上现今所有操作系统都自带支持,是最通用的压缩打包格式。

来到类 Unix 平台,基于 Unix 的思想,打包和压缩就分家了。

.tar 是一种打包格式。只负责将多个文件连带目录结构一起打包成一个 .tar 文件。原本是用于磁带备份的:将所有文件打包在一起录到磁带上。

将多个文件打包成 .tar 后再用 Gzip 算法压一下,就是 Linux 上最常见的 .tar.gz。同理,还有使用 Bzip2 压缩的 .tar.bz2。

这里道出了 .zip 和 .tar.* 的最大不同:前者是先压缩每个文件再打包,后者是先打包再一股脑压缩。所以前者可以单独只解压某一个文件,而后者需要从头开始(虽然,解压工具会直接在内存里抛弃掉不需要的文件,不会实际占用硬盘)直到解出你需要的那个文件。不过对于一种为磁带设计的格式,这种方式也是合理的,非常磁带。

LZMA 是一个压缩算法,压缩比非常离谱,当然速度也特别慢。

Zstandard 是 Facebook 搞的算法,特点是压缩时间比 LZMA 稍慢,但是解压速度快得离谱。这个特性非常适用于内容分发:你想想,在时间和算力近乎不用钱的服务器上把图片/视频/安装包用 Zstandard 压成非常离谱的大小,传到你电脑上用近乎无感的速度解压,那得节省多少带宽和下载时间。

使用 Zstandard 压缩的 .tar 通常扩展名是 .tar.zst

谷歌也搞过类似的 Brotli 算法,压缩率也非常离谱。但是得益于谷歌有但不多的影响力,只在极少数领域能见到:基于 Chromium 内核的浏览器,以及 Android 的 A/B 分区 OTA 包。

.7z 是 7-Zip 创建的压缩包。它支持多种压缩算法,但和 Tar 不同之处在于 Tar 是组合式的(tar 工具本身不负责压缩,你可以随意组合任何后来出现的算法,根据文件扩展名区分),而 .7z 是集成式的,算法记录在文件内,但需要工具本身支持