Compressione

Questo documento si applica al seguente metodo: API Update (v4): threatListUpdates.fetch.

Informazioni sulla compressione

La compressione è una funzionalità chiave delle API di Navigazione sicura (v4). La compressione riduce significativamente i requisiti di larghezza di banda, il che è particolarmente, ma non esclusivo, pertinente per i dispositivi mobili. Al momento, il server di Navigazione sicura 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. Navigazione sicura utilizza il tipo COMPRESSION_TYPE_UNSPECIFIED se non è impostato il tipo di compressione (verrà sostituita la compressione RAW).

Il server di Navigazione sicura utilizza anche la compressione HTTP standard per comprimere ulteriormente le risposte, indipendentemente dal tipo di compressione selezionato, a condizione che il client imposti l'intestazione di compressione HTTP corretta (leggi l'articolo di Wikipedia Compressione HTTP).

Compressione del riso

Come indicato, attualmente il server Navigazione sicura supporta la compressione del riso (leggi l'articolo di Wikipedia Codifica Golomb per un'analisi completa della codifica Golomb-Rice).

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 di 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 small-endian, ordinati in ordine crescente e quindi codificati 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] verrà 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 riso k (vedi sotto) viene memorizzato in riceParameter. Il campo numEntries contiene il numero di delta codificati nel codificatore Rice (3 nel nostro esempio riportato sopra, 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 (or, 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. Ciò significa 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 k bit 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 fa affidamento su un encoder/decoder di bit in cui è possibile aggiungere singoli bit al codificatore di bit, ovvero per codificare un quoziente q che potrebbe essere lungo solo due bit.

L'encoder di bit è un elenco di byte (8 bit). I bit vengono impostati dal bit significativo più basso nel primo byte a quello significativo più alto nel primo byte. Se tutti i bit di un byte sono già impostati, un nuovo byte (inizializzato a zero) viene aggiunto alla fine dell'elenco dei byte. Se l'ultimo byte non è stato utilizzato completamente, 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]