压缩
关于压缩
压缩是 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
都编码为 q
和 r
,其中 n = (q<<k) + r
(或 n = q * (2**k) + r
)、k
是常量编码器/解码器/解码器的常量和参数。q
和 r
的值在位流中使用不同的编码方案进行编码。
商 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] |