压缩

本文档适用于以下方法:Update API (v4)threatListUpdates.fetch

关于压缩

压缩是安全浏览 API (v4) 的一项重要功能。压缩会显著降低带宽要求,这对移动设备尤其有用,但并不仅限于此。 安全浏览服务器目前支持大米压缩。未来可能会添加其他压缩方法。

使用 supportedCompressions 字段和 CompressionType 设置压缩。 客户端应使用 RICE 和 RAW 压缩类型。如果未设置压缩类型(将替换为 RAW 压缩),安全浏览功能会使用 COMPRESSION_TYPE_UNSPECIFIED 类型。

无论选择哪种压缩类型,只要客户端设置了正确的 HTTP 压缩标头(请参阅维基百科文章 HTTP 压缩),安全浏览服务器也会使用标准 HTTP 压缩来进一步压缩响应。

Rice 压缩

如上所述,安全浏览服务器目前支持大米压缩(有关 Golomb-Rice 编码的完整讨论,请参阅维基百科文章 Golomb 编码)。

压缩/解压缩

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

对于移除索引,索引列表按升序排序,然后使用 RICE 编码进行增量编码。对于添加操作,系统会将 4 字节哈希前缀重新解释为小端字节序 uint32,按升序排序,然后使用 RICE 编码进行增量编码。请注意 RICE 压缩和 RAW 的哈希格式的不同:原始哈希值是按字典顺序排序的字节,而 Rice 哈希值是按升序(解压缩后)排序的 uint32。

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

第一个值存储在 firstValue 字段中,增量使用 Golomb-Rice 编码器进行编码。Rice 参数 k(见下文)存储在 riceParameter 中。numEntries 字段包含在米饭编码器中编码的增量数量(在上面的示例中为 3,而非 4)。encodedData 字段包含实际编码的增量。

编码器/解码器

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

商 q 以一元编码编码,后跟 0。也就是说,3 将编码为 1110,4 将编码为 11110,7 将编码为 11111110。商 q 先被解码。

余数 r 使用截断的二进制编码进行编码。只从比特流中写入(并因此读取)r 的最低有效位。余数 r 在对 q 进行解码后进行解码。

位编码器/解码器

莱斯编码器依赖于位编码器/解码器,在该程序中,单个位可以附加到位编码器;也就是说,用于对可能只有两位长的商 q 进行编码。

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

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