Kompresi

Tentang kompresi

Kompresi adalah fitur utama Web Risk. Kompresi secara signifikan mengurangi persyaratan bandwidth, yang terutama relevan untuk perangkat seluler. Server Web Risk saat ini mendukung kompresi Rice. Metode kompresi lainnya mungkin ditambahkan di masa mendatang.

Kompresi ditetapkan menggunakan kolom supportedCompressions dan CompressionType. Klien harus menggunakan jenis kompresi RICE dan RAW. Risiko Web menggunakan jenis COMPRESSION_TYPE_UNSPECIFIED jika jenis kompresi tidak ditetapkan (kompresi RAW akan diganti).

Server Web Risk juga akan menggunakan kompresi HTTP standar untuk lebih mengompresi respons, terlepas dari jenis kompresi yang dipilih, selama klien menetapkan header kompresi HTTP yang benar. Untuk mempelajari lebih lanjut, lihat artikel Wikipedia tentang Kompresi HTTP.

Kompresi rice

Seperti yang telah disebutkan, server Web Risk saat ini mendukung kompresi Rice. Untuk informasi selengkapnya, lihat artikel Wikipedia Golomb coding.

Kompresi/dekompresi

Objek RiceDeltaEncoding mewakili data yang dienkode Rice-Golomb dan digunakan untuk mengirim indeks penghapusan yang dikompresi atau awalan hash 4 byte yang dikompresi. 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 delta dienkode menggunakan encoding RICE. Untuk penambahan, awalan hash 4 byte diinterpretasikan ulang sebagai uint32 little-endian, diurutkan dalam urutan menaik, lalu delta dienkode 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 kami 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 untuk q dan r dienkode dalam streaming bit menggunakan skema encoding yang berbeda.

Hasil bagi q dienkode dalam coding unary, 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 terpotong. Hanya k bit r yang paling tidak signifikan yang ditulis (dan oleh karena itu dibaca) dari streaming bit. Sisa r didekode setelah mendekode q.

Encoder/decoder bit

Encoder Rice mengandalkan encoder/decoder bit tempat bit tunggal dapat ditambahkan ke encoder bit; yaitu, untuk mengenkode q hasil bagi 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, yang diinisialisasi ke nol, akan ditambahkan ke akhir daftar byte. Jika byte terakhir tidak digunakan sepenuhnya, bit signifikan tertingginya akan ditetapkan ke nol. Contoh:

Bits Added (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]