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 esclusivamente, importante 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 client devono utilizzare i tipi di compressione RICE e RAW. Navigazione sicura utilizza il tipo COMPRESSION_TYPE_UNSPECIFIED quando il tipo di compressione non è impostato (verrà sostituita la compressione RAW).
Il server Navigazione sicura utilizzerà 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 (vedi l'articolo di Wikipedia Compressione HTTP).
Compressione del riso
Come indicato, il server Navigazione sicura attualmente supporta la compressione Rice (per una discussione completa della codifica Golomb-Rice, consulta l'articolo di Wikipedia Codifica Golomb).
Compressione/decompressione
L'oggetto RiceDeltaEncoding rappresenta i dati codificati con 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 e poi codificato delta utilizzando la codifica RICE. Per le aggiunte, i prefissi hash di 4 byte vengono reinterpretati come uint32 little-endian, ordinati in ordine crescente e poi codificati delta utilizzando la codifica RICE. Tieni presente la differenza nel formato hash tra la compressione RICE e RAW: gli hash RAW sono byte ordinati lessicograficamente, mentre gli hash Rice sono uint32 ordinati in ordine crescente (dopo la decompressione).
ovvero l'elenco di numeri interi [1, 5, 7, 13] verrà codificato come 1 (il primo valore) e i delta [4, 2, 6].
Il primo valore viene memorizzato nel campo firstValue
e le differenze vengono codificate utilizzando un codificatore Golomb-Rice. Il parametro k di Rice (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
Nell'encoder/decoder Rice ogni delta n viene 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 di q e r sono codificati nel flusso di bit utilizzando schemi di codifica diversi.
Il quoziente q è codificato in codifica unaria seguito da uno 0. ovvero 3 verrebbe codificato come 1110, 4 come 11110 e 7 come 11111110. Il quoziente q viene decodificato per primo.
Il resto r viene 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 la decodifica di q.
Encoder/decoder di bit
Il codificatore Rice si basa su un codificatore/decodificatore 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.
Il codificatore di bit è un elenco di byte (8 bit). I bit sono impostati dal bit meno significativo nel primo byte al bit più significativo 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 di byte. Se l'ultimo byte non viene utilizzato completamente, i suoi bit più significativi vengono impostati su zero. Esempio:
Bit aggiunti | BitEncoder After Adding Bits |
---|---|
[] | |
0 | [00000000] |
1 | [00000010] |
1 | [00000110] |
1,0,1 | [00101110] |
0,0,0 | [00101110, 00000000] |
1,1,0 | [00101110, 00000110] |