压缩

关于压缩

压缩是 Web Risk 的关键功能。压缩可显着降低带宽要求,这对移动设备尤为重要。Web Risk 服务器目前支持 Rice 压缩。将来可能会添加更多的压缩方法。

使用 supportedCompressions 字段和 CompressionType 设置压缩。客户端应使用 RICE 和 RAW 压缩类型。如果未设置压缩类型,Web Risk 将使用 COMPRESSION_TYPE_UNSPECIFIED 类型(将替换 RAW 压缩)。

Web Risk 服务器还会使用标准 HTTP 压缩来进一步压缩响应,而不考虑所选的压缩类型,只要客户端设置正确的 HTTP 压缩标头即可。如要了解详情,请参阅维基百科上关于 HTTP 压缩的文章。

Rice 压缩

如前所述,Web Risk 服务器目前支持 Rice 压缩。如需了解详情,请参阅维基百科上关于 Golomb 编码的文章。

压缩/解压缩

RiceDeltaEncoding 对象表示 Rice-Golomb 编码数据,用于发送压缩的移除索引或压缩的 4 字节哈希前缀。长度超过 4 个字节的哈希前缀将不会进行压缩,并以原始格式提供。

对于删除索引,索引列表按升序排序,然后使用 RICE 编码进行增量编码。对于添加项,系统会将 4 个字节的哈希前缀重新解读为小端字节序 uint32s,按升序排列,然后使用 RICE 编码进行增量编码。请注意 RICE 压缩和 RAW 之间的哈希格式差异:原始哈希是按字典顺序排序的字节,而 RICE 哈希是按 uint32s 升序排序(解压缩后)。

也就是说,整数列表 [1、5、7、13] 将被编码为 1(第一个值)和增量 [4、2、6]。

第一个值存储在 firstValue 字段中,而增量则使用 Golumb-Rice 编码器进行编码。Rice 参数 k(请参阅下文)存储在 riceParameter 中。numEntries 字段包含 Rice 编码器中编码的增量数量(在我们的上面的示例中为 3,而不是 4)。encodedData 字段包含实际编码的增量。

编码器/解码器

在 Rice 编码器/解码器中,每个增量 n 都编码为 qr,其中 n = (q<<k) + r(或 n = q * (2**k) + r)、k 是常量编码器/解码器/解码器的常量和参数。qr 的值在位流中使用不同的编码方案进行编码。

q 采用一元编码进行编码,后跟 0。也就是说,3 将编码为 1110,4 编码为 11110,7 编码 11111110。先对商 q 进行解码。

余数 r 使用截断的二进制编码进行编码。只有 r 中最不重要的 k 位才会从位流写入(也就是读取)。余数 r 在解码 q 之后进行解码。

位编码器/解码器

Rice 编码器依赖于位编码器/解码器,可以将单个位附加到位编码器上;也就是说,对可能只有两位的长度的商 q 进行编码。

位编码器是一个 8 位字节的列表。位从第一个字节中的最低有效位设置到第一个字节中的最高有效位。如果字节的所有位都已设置,则将初始化为零的新字节会附加到字节列表的末尾。如果最后一个字节未完全使用,则其最高有效位设置为零。例如:

已添加的位 在添加位后的 BitEncoder
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]