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] |