壓縮

本文適用於下列方法: 更新 API (第 4 版)threatListUpdates.fetch

關於壓縮

壓縮是 Safe Browsing API (v4) 的主要功能。壓縮可大幅降低頻寬需求,這對行動裝置尤其重要,但並非僅限於行動裝置。安全瀏覽伺服器目前支援 Rice 壓縮。日後可能會新增其他壓縮方法。

壓縮設定是使用 supportedCompressions 欄位和 CompressionType 設定。用戶端應使用 RICE 和 RAW 壓縮類型。如果未設定壓縮類型,安全瀏覽會使用 COMPRESSION_TYPE_UNSPECIFIED 類型 (系統會改用 RAW 壓縮)。

無論選取的壓縮類型為何,只要用戶端設定正確的 HTTP 壓縮標頭 (請參閱維基百科文章「HTTP 壓縮」),安全瀏覽伺服器就會使用標準 HTTP 壓縮進一步壓縮回應。

Rice 壓縮

如前所述,安全瀏覽伺服器目前支援 Rice 壓縮 (如要完整瞭解 Golomb-Rice 編碼,請參閱 Wikipedia 文章「Golomb coding」)。

壓縮/解壓縮

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

如果是移除索引,系統會先將索引清單依遞增順序排序,然後使用 RICE 編碼進行 Delta 編碼。如果是新增項目,系統會將 4 位元組的雜湊前置字元重新解讀為小端序的 uint32,並依遞增順序排序,然後使用 RICE 編碼進行差異編碼。請注意,RICE 壓縮和 RAW 之間的雜湊格式有所不同:原始雜湊是經過字典排序的位元組,而 Rice 雜湊是經過遞增排序的 uint32 (解壓縮後)。

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

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

編碼器/解碼器

在 Rice 編碼器/解碼器中,每個 delta 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 位元會寫入 (並因此讀取) 位元串流。解碼 q 後,系統會解碼餘數 r。

位元編碼器/解碼器

Rice 編碼器依賴位元編碼器/解碼器,其中單一位元可以附加至位元編碼器;也就是說,要編碼的商數 q 最多只能是兩位元。

位元編碼器是 (8 位元) 位元組清單。位元會從第一個位元組的最低有效位元,設定至第一個位元組的最高有效位元。如果位元組的所有位元都已設定,系統會在位元組清單的結尾附加新的位元組 (初始化為零)。如果最後一個位元組未完全使用,則最高有效位元會設為零。範例:

新增的 Bits 新增位元後的 BitEncoder
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]