Compressione

Informazioni sulla compressione

La compressione è una funzionalità chiave di Web Risk. La compressione riduce notevolmente i requisiti di larghezza di banda, particolarmente importanti per i dispositivi mobili. Attualmente il server Web Risk supporta la compressione Rice. In futuro potrebbero essere aggiunti altri metodi di compressione.

La compressione viene impostata utilizzando il campo supportedCompressions e CompressionType. I clienti devono utilizzare i tipi di compressione RICE e RAW. Web Risk utilizza il tipo COMPRESSION_TYPE_UNSPECIFIED se il tipo di compressione non è impostato (la compressione RAW verrà sostituita).

Il server Web Risk utilizza inoltre la compressione HTTP standard per comprimere ulteriormente le risposte, indipendentemente dal tipo di compressione selezionato, purché il client imposti l'intestazione di compressione HTTP corretta. Per scoprire di più, consulta l'articolo di Wikipedia relativo alla compressione HTTP.

Compressione del riso

Come indicato, attualmente il server Web Risk supporta la compressione Rice. Per ulteriori informazioni, leggi l'articolo di Wikipedia Programmazione di Golomb.

Compressione/decompressione

L'oggetto RiceDeltaEncoding rappresenta i dati codificati di Rice-Golomb e viene utilizzato per inviare indici di rimozione compressi o prefissi hash compressi a 4 byte. I prefissi hash più lunghi di 4 byte non verranno compressi e verranno pubblicati in formato non elaborato.

Per gli indici di rimozione, l'elenco degli indici viene ordinato in ordine crescente, quindi codificato mediante delta utilizzando la codifica RICE. Per le aggiunte, i prefissi hash a 4 byte vengono reinterpretati come uint32 di Little Endian, ordinati in ordine crescente e poi codificati con delta utilizzando la codifica RICE. Nota la differenza nel formato hash tra la compressione RICE e RAW: gli hash non elaborati sono byte ordinati lessicograficamente, mentre gli hash RICE sono uint32 ordinati in ordine crescente (dopo la decompressione).

In altre parole, l'elenco dei numeri interi [1, 5, 7, 13] viene codificato come 1 (il primo valore) e come delta [4, 2, 6].

Il primo valore viene memorizzato nel campo firstValue e i delta vengono codificati utilizzando un codificatore Golomb-Rice. Il parametro del riso k (vedi sotto) è memorizzato in riceParameter. Il campo numEntries contiene il numero di delta codificati nel codificatore Rice (3 nel nostro esempio precedente, non 4). Il campo encodedData contiene i delta codificati effettivi.

encoder/decoder

Nel codificatore/decoder Rice, ogni delta n è codificato come q e r, dove n = (q<<k) + r (o n = q * (2**k) + r). k è una costante e un parametro dell'encoder/decoder Rice. I valori per q e r sono codificati nel flusso di bit utilizzando schemi di codifica diversi.

Il quoziente q è codificato in una codifica unaria seguita da uno 0. Vale a dire che 3 viene codificato come 1110, 4 come 11110 e 7 come 11111110. Il quoziente q viene decodificato per primo.

Il resto r è codificato utilizzando la codifica binaria troncata. Solo i bit k meno significativi di r vengono scritti (e quindi letti) dal flusso di bit. Il resto (r) viene decodificato dopo aver decodificato q.

Codificatore/decoder di bit

L'encoder Rice si basa su un encoder/decoder in cui i singoli bit possono essere aggiunti all'encoder di bit, ovvero per codificare un quoziente q che potrebbe essere lungo solo due bit.

L'encoder di bit è un elenco di byte a 8 bit. I bit vengono impostati dal bit significativo più basso nel primo byte a quello significativo più alto nel primo byte. Se per un byte sono già impostati tutti i bit, alla fine dell'elenco dei byte viene aggiunto un nuovo byte inizializzato a zero. Se l'ultimo byte non è completamente utilizzato, i bit significativi più alti vengono impostati su zero. Esempio:

Bit aggiunti BitEncoder dopo l'aggiunta di bit
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]