壓縮

這份文件適用於下列方法:Update API (v4)threatListUpdates.fetch

關於壓縮

壓縮是 Safe Browsing API (第 4 版) 的重要功能。壓縮功能可大幅降低頻寬需求,尤其是對行動裝置而言,雖非必要,但並非僅限於此。安全瀏覽伺服器目前支援 Rice 壓縮功能。我們日後可能會加入其他壓縮方法。

使用 supportedCompressions 欄位和 CompressionType 來設定壓縮方式。用戶端應使用 RICE 和 RAW 壓縮類型。如未設定壓縮類型,安全瀏覽功能會使用 COMPRESSION_TYPE_UNSPECIFIED 類型 (系統會替換 RAW 壓縮)。

只要用戶端設定正確的 HTTP 壓縮標頭,安全瀏覽伺服器也會使用標準 HTTP 壓縮功能進一步壓縮回應 (請參閱 Wikipedia 文章 HTTP 壓縮)。

米壓縮

如前所述,安全瀏覽伺服器目前支援 Rice 壓縮功能 (如需有關 Golomb-Rice 編碼的完整討論,請參閱 Wikipedia 的 Golomb 程式設計一文)。

壓縮/解壓縮

RiceDeltaEncoding 物件代表 Rice-Golomb 編碼資料,可用來傳送經過壓縮的移除索引或經過壓縮的 4 位元組雜湊前置字串。(長度超過 4 個位元組的雜湊前置字串不會壓縮,而是以原始格式提供)。

對於移除索引,索引清單會依照遞增順序排序,然後使用 RICE 編碼進行差異遷移。此外,4 位元組雜湊前置字串會重新解讀為 Little-endian uint32s (遞增排序),然後使用 RICE 編碼進行差異化編碼。請注意 RICE 壓縮和 RAW 之間的雜湊格式差異:原始雜湊是按字母順序排序的位元組,而 Rice 雜湊 uint32s 則是以遞增順序排序 (解壓縮後)。

也就是說,整數 [1, 5, 7, 13] 的清單會編碼為 1 (第一個值) 和差異 [4, 2, 6]。

第一個值會儲存在 firstValue 欄位中,而差異遷移會使用 Golomb-Rice 編碼器編碼。米參數 k (請見下文) 儲存在 BrainParameter 中。numEntries 欄位包含 Rice 編碼器中編碼的差異數量 (在上述範例中為 3,而非 4)。encodedData 欄位包含實際編碼的差異值。

編碼器/解碼器

在 Rice 編碼器/解碼器中,每個 delta n 都會編碼為 q 和 r,其中 n = (q<<k) + r (或是 n = q * (2**k) + r)。k 是 Rice 編碼器/解碼器的常數和參數。q 和 r 的值會使用不同編碼配置在位元串流中編碼。

商 q 在一元編碼中編碼為 0,後接 0。也就是說,3 會編碼為 1110,4 為 11110,7 則為 11111110。商 q 會先解碼。

餘數 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]