壓縮

關於壓縮

壓縮是 Web Risk 的重要功能。壓縮可大幅減少頻寬需求,這對行動裝置尤其重要。Web Risk 伺服器目前支援 Rice 壓縮。日後可能會新增更多壓縮方法。

壓縮設定是使用 supportedCompressions 欄位和 CompressionType 設定。用戶端應使用 RICE 和 RAW 壓縮類型。如果未設定壓縮類型,網頁風險掃描會使用 COMPRESSION_TYPE_UNSPECIFIED 類型 (系統會改用 RAW 壓縮)。

無論選取的壓縮類型為何,只要用戶端設定正確的 HTTP 壓縮標頭,Web Risk 伺服器也會使用標準 HTTP 壓縮進一步壓縮回應。詳情請參閱維基百科上有關 HTTP 壓縮的文章。

Rice 壓縮

如前所述,Web Risk 伺服器目前支援 Rice 壓縮。 詳情請參閱維基百科的「Golomb 編碼」一文。

壓縮/解壓縮

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

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

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

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

編碼器/解碼器

在 Rice 編碼器/解碼器中,每個增量 n 都會編碼為 qr,其中 n = (q<<k) + r (或 n = q * (2**k) + r)。k 是常數,也是 Rice 編碼器/解碼器的參數。qr 的值會使用不同的編碼方式編碼至位元串流中。

商數 q 會以一元編碼方式編碼,後面接著 0。也就是說,3 會編碼為 1110,4 會編碼為 11110,7 則會編碼為 11111110。先解碼商數 q

其餘 r 則使用截斷的二進位編碼進行編碼。只有位元串流中最不重要的 k 位元會寫入 (並因此讀取) r。解碼 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]