#byte #string #size #short

byte-size

一个完全不考虑速度、内存使用和可执行文件大小的有效短字符串压缩器

11个版本

0.2.7 2023年2月6日
0.2.6 2023年2月5日
0.1.1 2023年2月1日

#196 in 压缩

MIT许可协议

2.5MB
796

字节大小

Crates.io Docs.rs License

一个短字符串压缩/解压缩器,可以存储20,000+个单词,且占用三个字节或更少的空间。

类似于smaz,byte-size能够压缩小字符串,这是其他传统压缩算法难以做到的。

然而,byte-size通常比smaz更好,尤其是在非常常用的单词上(在10,000个最常用单词中,不到1%的单词在smaz中有更好的压缩效果)。byte-size还可以比smaz更高效地表示数字、重复序列和非字母数字字符。它可以编码Unicode字符,但效率不高。如果您的文本包含一些Unicode字符,它仍然可以更好地压缩,但如果您的字符串主要是Unicode字符,则其他方案(如Unishox)更好。

成本

byte-size使用几个包含超过18,000个条目的表。显然,这将产生大量的运行时内存和二进制文件大小成本,但如果您有足够的内存,这值得更有效的压缩。

示例

使用直接从smaz中获取的示例

[插入示例]

我们可以看到,每个示例在byte-size中的压缩效果都比smaz好。

为什么?

基本上就是两个表:一个是关于大约一千个最常用词素(可表示为2个字节)的表,另一个是关于10万个词素(可表示为3个字节)的表。

除此之外,我们还有一些常用的2和3个字节的序列,可以用1个字节表示,可以作为词素的词首/词尾,或者用来构建列表中未包含的单词。

有三个列表

  • 单字节奇数(OBW):由可打印的ASCII字符(包括一些控制序列)、常见的词首/词尾和常见的双字组成。
  • 双字节常见(TBC):由1793个最常见词素(不包括OBW列表中的词素)组成。
  • 三字节不常见(TBU):由16512个最常见词素(不在前两个列表中的词素)组成。

这些列表存储在包的根目录中。这些列表可以修改,并且这些修改将生效。列表表示为文件,其中每行是一个新词素,通过百分比编码进行编码(以允许非打印字符和Unicode序列)。

编码

  • 单字节奇数序列来自smaz
    • 我们过滤掉了某些表现不佳的序列
  • 两个字节的常用词和三个字节的罕见词来自这里
    • 只有当它们的表示更为紧凑时,单词才会被选中(例如,单词'the'既不出现在2字节表也不出现在3字节表中,因为它可以用1字节表示)

Snaz编码如下

  • 一个字节的序列包括240个。这些一个字节的序列是它们在正常位置上的ascii值,其他常见序列填充空隙
    • 这留下了16个多字节码的值。
      • 其中之一用于指示将跟随一个Unicode标量值
      • 这留下了15*256=3840种两种字节序列的组合,这些组合如下划分
        • 3586用于编码2字节常用词,1793带有空格前缀,1793没有
        • 32用于编码自定义词
        • 32用于编码4到35个重复单元之间的序列重复
        • 32用于编码数字。32个值意味着总共5位,其中3位用于字节数,2位用于数字本身
        • 29用于编码不可打印的控制字符
        • 129用于3字节码。129*256 = 33024种组合
          • 所有33024种组合都用于编码3字节罕见词,16512带有空格前缀,16512没有

依赖项