本文档适用于以下方法:Update API (v4):threatListUpdates.fetch。
关于压缩
压缩是安全浏览 API (v4) 的一项关键功能。压缩可显着降低带宽要求,这对移动设备尤为重要,但不仅仅如此。 安全浏览服务器目前支持 Rice 压缩。将来可能会添加其他压缩方法。
使用 supportedCompressions 字段和 CompressionType 设置压缩。 客户端应使用 RICE 和 RAW 压缩类型。如果未设置压缩类型,安全浏览将使用 COMPRESSION_TYPE_UNSPECIFIED 类型(将替换 RAW 压缩)。
无论选择哪种压缩类型,只要客户端设置正确的 HTTP 压缩标头(请参阅维基百科文章 HTTP 压缩),Safe Browsing 服务器还会使用标准 HTTP 压缩来进一步压缩响应。
Rice 压缩
如前所述,安全浏览服务器目前支持 Rice 压缩(如需全面了解 Golomb-Rice 编码,请参阅维基百科上关于 Golomb 编码的文章)。
压缩/解压缩
RiceDeltaEncoding 对象表示 Rice-Golomb 编码数据,用于发送压缩的移除索引或压缩的 4 字节哈希前缀。(长度超过 4 个字节的哈希前缀将不会进行压缩,并以原始格式提供。)
对于移除索引,索引列表按升序排序,然后使用 RICE 编码进行增量编码。对于添加项,系统会将 4 个字节的哈希前缀重新解读为小端字节序 uint32s,按升序排列,然后使用 RICE 编码进行增量编码。 请注意 RICE 压缩和 RAW 之间的哈希格式差异:原始哈希是按字典顺序排序的字节,而 Rice 哈希是按升序排序的 uint32(解压缩后)。
也就是说,整数列表 [1、5、7、13] 将被编码为 1(第一个值)和增量 [4、2、6]。
第一个值存储在 firstValue
字段中,而增量则使用 Golomb-Rice 编码器进行编码。Rice 参数 k(请参阅下文)存储在 riceParameter 中。numEntries
字段包含 Rice 编码器中编码的增量数量(在我们的上面的示例中为 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 中最不重要的 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] |