Este documento se aplica ao seguinte método: API Update (v4): threatListUpdates.fetch.
Sobre a compactação
A compactação é um recurso importante das APIs da Navegação segura (v4). A compactação reduz significativamente os requisitos de largura de banda, o que é particularmente, mas não exclusivamente, relevante para dispositivos móveis. No momento, o servidor do Navegação segura é compatível com a compactação de arroz. Métodos de compactação adicionais podem ser adicionados no futuro.
A compactação é definida usando o campo supportedCompressions e CompressionType. Os clientes devem usar os tipos de compactação RICE e RAW. O recurso Navegação segura usa o tipo COMPRESSION_TYPE_UNSPECIFIED quando o tipo de compactação não está definido (a compactação RAW será substituída).
O servidor da Navegação segura também usa a compactação HTTP padrão para compactar ainda mais as respostas, independentemente do tipo de compactação selecionado, desde que o cliente defina o cabeçalho de compactação HTTP correto. Consulte o artigo da Wikipédia Compactação HTTP (link em inglês).
Compactação Rice
Conforme observado, o servidor da Navegação segura atualmente oferece suporte à compressão de arroz. Consulte o artigo da Wikipédia Código Golomb (link em inglês) para uma discussão completa sobre a codificação Golomb-Rice.
Compactação/descompactação
O objeto RiceDeltaEncoding representa os dados codificados na Rice-Golomb e é usado para enviar índices de remoção compactados ou prefixos de hash de 4 bytes compactados. Os prefixos de hash com mais de 4 bytes não são compactados, e são exibidos no formato bruto.
Para índices de remoção, a lista é classificada em ordem crescente e, em seguida, codificada em delta usando a codificação RICE. Para adições, os prefixos de hash de 4 bytes são reinterpretados como uint32s few-endian, classificados em ordem crescente e, em seguida, codificados em delta usando a codificação RICE. Há uma diferença no formato de hash entre a compactação RICE e RAW: os hashes brutos são bytes classificados lexicograficamente, enquanto os hashes Rice são uint32s classificados em ordem crescente (após a descompactação).
Ou seja, a lista de números inteiros [1, 5, 7, 13] será codificada como 1 (o primeiro valor) e os deltas [4, 2, 6].
O primeiro valor é armazenado no campo firstValue
e os deltas são codificados usando um codificador Golomb-Rice. O parâmetro k do Rice (veja abaixo) é armazenado em riceParameter. O campo numEntries
contém o número de deltas codificados no codificador de arroz (3 no nosso exemplo acima, não 4). O campo encodedData
contém os deltas codificados reais.
Codificador/decodificador
No codificador/decodificador de arroz, cada delta n é codificado como q e r, em que n = (q<<k) + r (ou, n = q * (2**k) + r). k é uma constante e um parâmetro do codificador/decodificador de arroz. Os valores para q e r são codificados no fluxo de bits usando esquemas de codificação diferentes.
O quociente q é codificado em codificação unária seguido por 0. Ou seja, 3 seria codificado como 1110, 4 como 11110 e 7 como 11111110. O quociente q é decodificado primeiro.
O restante r é codificado usando codificação binária truncada. Somente os k bits menos significativos de r são gravados (e, portanto, lidos) a partir do fluxo de bits. O restante r é decodificado depois de ter decodificado q.
Codificador/decodificador de bits
O codificador de arroz depende de um codificador/decodificador de bits em que bits únicos podem ser anexados ao codificador de bits, ou seja, para codificar um quociente q que pode ter apenas dois bits.
O codificador de bits é uma lista de bytes (8 bits). Os bits são definidos do bit mais baixo no primeiro byte até o mais alto no primeiro byte. Se um byte tiver todos os bits já definidos, um novo byte (inicializado como zero) será anexado ao fim da lista de bytes. Se o último byte não for totalmente usado, os bits mais importantes serão definidos como zero. Exemplos
Bits adicionados | BitEncoder após adicionar bits |
---|---|
[] | |
0 | [00000000] |
1 | [00000010] |
1 | [00000110] |
1,0,1 | [00101110] |
0,0,0 | [00101110, 00000000] |
1,1,0 | [00101110, 00000110] |