Compactação

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]