圧縮

このドキュメントは、Update API(v4): threatListUpdates.fetch メソッドに適用されます。

圧縮について

圧縮は、セーフ ブラウジング API(v4)の重要な機能です。圧縮を使用すると、帯域幅の要件が大幅に削減されます。これは、モバイル デバイスに特に関連しますが、これに限定されません。セーフ ブラウジング サーバーは現在、Rice 圧縮をサポートしています。今後、追加の圧縮方法が追加される可能性があります。

圧縮は、supportedCompressions フィールドと CompressionType を使用して設定されます。クライアントは RICE 圧縮タイプと RAW 圧縮タイプを使用する必要があります。圧縮タイプが設定されていない場合、セーフ ブラウジングは COMPRESSION_TYPE_UNSPECIFIED タイプを使用します(RAW 圧縮が代わりに使用されます)。

クライアントが正しい HTTP 圧縮ヘッダーを設定している限り(Wikipedia の記事 HTTP 圧縮を参照)、選択された圧縮タイプに関係なく、セーフ ブラウジング サーバーは標準の HTTP 圧縮を使用してレスポンスをさらに圧縮します。

Rice 圧縮

前述のとおり、セーフ ブラウジング サーバーは現在、Rice 圧縮をサポートしています(Golomb-Rice コーディングの詳細については、Wikipedia の記事の Golomb コーディングをご覧ください)。

圧縮 / 解凍

RiceDeltaEncoding オブジェクトは、Rice-Golomb でエンコードされたデータを表し、圧縮された削除インデックスまたは圧縮された 4 バイトのハッシュ プレフィックスを送信するために使用されます。(4 バイトを超えるハッシュ プレフィックスは圧縮されず、未加工の形式で配信されます)。

削除インデックスの場合、インデックスのリストは昇順で並べ替えられ、RICE エンコードを使用してデルタ エンコードされます。また、4 バイトのハッシュ プレフィックスは、リトル エンディアンの uint32 として再解釈され、昇順で並べ替えられ、RICE エンコードを使用してデルタ エンコードされます。RICE 圧縮と RAW のハッシュ形式は異なります。未加工のハッシュは辞書順で並べ替えられたバイトですが、Rice ハッシュは昇順(解凍後)で並べ替えられた uint32 です。

つまり、整数のリスト [1、5、7、13] は 1(最初の値)として、デルタは [4、2、6] としてエンコードされます。

最初の値は firstValue フィールドに格納され、デルタは Golomb-Rice エンコーダを使用してエンコードされます。Rice パラメータ k(下記参照)は、riceParameter に保存されます。numEntries フィールドには、Rice エンコーダでエンコードされたデルタの数が含まれます(上記の例では 4 ではなく 3)。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 エンコーダは、ビット エンコーダに単一のビットを追加できるビット エンコーダ/デコーダに依存しています。つまり、2 ビット長の除算の商 q をエンコードします。

ビット エンコーダは(8 ビット)バイトのリストです。ビットは最初のバイトの最下位ビットから最初のバイトの最上位ビットに設定されます。バイトのすべてのビットがすでに設定されている場合、新しいバイト(ゼロに初期化)がバイトリストの末尾に追加されます。最後のバイトが完全に使用されていない場合、その最上位ビットはゼロに設定されます。例:

追加されたビット ビットを追加した後の BitEncoder
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]