如何击败gzip(或其他无损压缩)

时间:2010-08-06 16:18:15

标签: compression gzip

通过鸽子原理,每个无损压缩算法都可以“失败”,即对于某些输入,它产生的输出比输入长。是否有可能明确地构建一个文件,当该文件被送到例如gzip或其他无损压缩程序,会导致(更多)更大的输出? (或者,更好的是,文件在随后的压缩中无限制地膨胀?)

5 个答案:

答案 0 :(得分:8)

嗯,我最终会假设它会最大化,因为位模式会重复,但我只是这样做了:

touch file
gzip file -c > file.1
...
gzip file.9 -c > file.10

得到了:

  0 bytes: file
 25 bytes: file.1
 45 bytes: file.2
 73 bytes: file.3
103 bytes: file.4
122 bytes: file.5
152 bytes: file.6
175 bytes: file.7
205 bytes: file.8
232 bytes: file.9
262 bytes: file.10

这里有24,380个图形文件(实际上真的对我来说很惊讶):

alt text http://research.engineering.wustl.edu/~schultzm/images/filesize.png

我没想到会出现这种增长,我只希望线性增长,因为它应该只是将现有数据封装在带有模式字典的标题中。我打算运行1,000,000个文件,但在此之前我的系统用完了磁盘空间。

如果要重现,请使用bash脚本生成文件:

#!/bin/bash

touch file.0

for ((i=0; i < 20000; i++)); do
    gzip file.$i -c > file.$(($i+1))
done

wc -c file.* | awk '{print $2 "\t" $1}' | sed 's/file.//' | sort -n > filesizes.txt

生成的filesizes.txt是您喜欢的图形工具的制表符分隔文件。 (您必须手动删除“总计”字段,或将其编写脚本。)

答案 1 :(得分:3)

随机数据或使用优质cypher加密的数据可能是最好的。

但是,一旦确定它无法压缩数据,任何好的打包程序都应该只添加常量开销。 (@坦率)。对于固定开销,空文件或单个字符将提供最大的百分比开销。

对于包含文件名(例如rar,zip,tar)的打包者,您当然可以使文件名真正长: - )

答案 2 :(得分:0)

尝试gzip由以下命令产生的文件:

echo a > file.txt

压缩2字节文件导致31字节的gzip压缩文件!

答案 3 :(得分:0)

其中包含1个字节的文本文件(例如一个字符,如“A”)存储在磁盘上的1个字节中,但winrar将其格式化为94个字节并将其压缩为141个字节。

我知道这是一种作弊的答案,但它确实有效。我认为这将是您将要看到的原始尺寸和“压缩”尺寸之间最大的%差异。

看一下压缩的公式,它们相当简单,并且要使“压缩”文件大于原始文件,最基本的方法是避免任何重复数据。

答案 4 :(得分:0)

所有这些压缩算法都在寻找冗余数据。如果您的文件中没有冗余或非常少的冗余(例如abac…azbcbd…bzcdce…cz等序列,那么“缩小”的输出很可能是充气。