壓縮
關於壓縮
壓縮是 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
都會編碼為 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
則使用截斷的二進位編碼進行編碼。只有位元串流中最不重要的 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] |