Kompresi

Dokumen ini berlaku untuk metode berikut: Update API (v4): threatListUpdates.fetch.

Tentang kompresi

Kompresi adalah fitur utama Safe Browsing API (v4). Kompresi secara signifikan mengurangi persyaratan bandwidth, yang sangat relevan, tetapi tidak eksklusif, untuk perangkat seluler. Server Safe Browsing saat ini mendukung kompresi Rice. Metode kompresi tambahan dapat ditambahkan pada masa mendatang.

Kompresi ditetapkan menggunakan kolom supportedCompressions dan CompressionType. Klien harus menggunakan jenis kompresi RICE dan RAW. Safe Browsing menggunakan jenis COMPRESSION_TYPE_UNSPECIFIED jika jenis kompresi tidak ditetapkan (kompresi RAW akan digantikan).

Server Safe Browsing juga akan menggunakan kompresi HTTP standar untuk lebih mengompresi respons, terlepas dari jenis kompresi yang dipilih, selama klien menetapkan header kompresi HTTP yang benar (lihat artikel Wikipedia Kompresi HTTP).

Kompresi Rice

Seperti yang disebutkan, server Safe Browsing saat ini mendukung kompresi Rice (lihat artikel Wikipedia tentang Golomb coding untuk pembahasan lengkap tentang pengodean Golomb-Rice).

Kompresi/dekompresi

Objek RiceDeltaEncoding merepresentasikan data yang dienkode Rice-Golomb dan digunakan untuk mengirim indeks penghapusan terkompresi atau awalan hash 4 byte terkompresi. (Awalan hash yang lebih panjang dari 4 byte tidak akan dikompresi, dan akan ditayangkan dalam format mentah.)

Untuk indeks penghapusan, daftar indeks diurutkan dalam urutan menaik, lalu dienkode delta menggunakan encoding RICE. Untuk penambahan, awalan hash 4 byte ditafsirkan ulang sebagai uint32 little-endian, diurutkan dalam urutan menaik, lalu dienkode delta menggunakan encoding RICE. Perhatikan perbedaan format hash antara kompresi RICE dan RAW: hash mentah adalah byte yang diurutkan secara leksikografis, sedangkan hash Rice adalah uint32 yang diurutkan dalam urutan menaik (setelah dekompresi).

Artinya, daftar bilangan bulat [1, 5, 7, 13] akan dienkode sebagai 1 (nilai pertama) dan delta [4, 2, 6].

Nilai pertama disimpan di kolom firstValue dan delta dienkode menggunakan encoder Golomb-Rice. Parameter Rice k (lihat di bawah) disimpan di riceParameter. Kolom numEntries berisi jumlah delta yang dienkode dalam encoder Rice (3 dalam contoh di atas, bukan 4). Kolom encodedData berisi delta yang dienkode sebenarnya.

Encoder/decoder

Dalam encoder/decoder Rice, setiap delta n dienkode sebagai q dan r dengan n = (q<<k) + r (atau, n = q * (2**k) + r). k adalah konstanta dan parameter encoder/decoder Rice. Nilai q dan r dienkode dalam aliran bit menggunakan skema encoding yang berbeda.

Hasil bagi q dienkode dalam pengodean unary yang diikuti dengan 0. Artinya, 3 akan dienkode sebagai 1110, 4 sebagai 11110, dan 7 sebagai 11111110. Hasil bagi q didekode terlebih dahulu.

Sisa r dienkode menggunakan encoding biner yang dipangkas. Hanya k bit paling tidak signifikan dari r yang ditulis (dan oleh karena itu dibaca) dari aliran bit. Sisa r didekode setelah mendekode q.

Encoder/decoder bit

Encoder Rice mengandalkan encoder/dekoder bit yang dapat menambahkan bit tunggal ke encoder bit; yaitu, untuk mengenkode hasil bagi q yang hanya dapat memiliki panjang dua bit.

Encoder bit adalah daftar byte (8-bit). Bit ditetapkan dari bit signifikan terendah di byte pertama hingga bit signifikan tertinggi di byte pertama. Jika semua bit byte sudah ditetapkan, byte baru (diinisialisasi ke nol) akan ditambahkan ke akhir daftar byte. Jika byte terakhir tidak digunakan sepenuhnya, bit signifikan tertingginya akan disetel ke nol. Contoh:

Bit Ditambahkan BitEncoder Setelah Menambahkan Bit
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]