Kompresi

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

Tentang kompresi

Kompresi adalah fitur utama pada Safe Browsing API (v4). Kompresi secara signifikan mengurangi persyaratan bandwidth, yang secara khusus, tetapi tidak eksklusif, relevan untuk perangkat seluler. Server Safe Browsing saat ini mendukung kompresi Beras. Metode kompresi lain dapat ditambahkan di 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 diganti).

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

Kompresi beras

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

Kompresi/dekompresi

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

Untuk indeks penghapusan, daftar indeks diurutkan dalam urutan menaik lalu dienkode delta menggunakan encoding RICE. Sebagai tambahan, awalan hash 4 byte ditafsirkan ulang sebagai uint32 small-endian, yang 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 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 dalam RiceParameter. Kolom numEntries berisi jumlah delta yang dienkode dalam encoder Rice (3 dalam contoh di atas, bukan 4). Kolom encodedData berisi delta yang dienkode yang 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 dari encoder/decoder Rice. Nilai untuk q dan r dienkode dalam aliran bit menggunakan skema encoding yang berbeda.

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

Sisanya, r, dienkode menggunakan encoding biner yang terpotong. Hanya k bit paling tidak signifikan dari r yang akan ditulis (sehingga dibaca) dari aliran bit. Sisa r didekode setelah q didekode.

Encoder/decoder bit

Encoder Rice bergantung pada bit encoder/decoder yang memiliki bit tunggal yang dapat ditambahkan ke encoder bit; yaitu, untuk mengenkode q hasil bagi yang panjangnya hanya dua bit.

Encoder bit adalah daftar byte (8-bit). Bit ditetapkan dari bit signifikan terendah pada byte pertama ke bit signifikan tertinggi pada byte pertama. Jika satu byte sudah menetapkan semua bit-nya, byte baru (diinisialisasi ke nol) akan ditambahkan ke bagian akhir daftar byte. Jika byte terakhir tidak sepenuhnya digunakan, bit signifikan tertingginya akan ditetapkan 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]