Compresión

Este documento se aplica al siguiente método: API de Update (v4): threatListUpdates.fetch.

Información acerca de la compresión

La compresión es una función clave de las APIs de Navegación segura (v4). La compresión reduce de forma significativa los requisitos de ancho de banda, lo que es particularmente relevante para los dispositivos móviles. Actualmente, el servidor de Navegación segura admite la compresión Rice. Es posible que se agreguen más métodos de compresión en el futuro.

La compresión se configura mediante el campo supportedCompressions y CompressionType. Los clientes deben usar los tipos de compresión RICE y RAW. La Navegación segura usa el tipo COMPRESSION_TYPE_UNSPECIFIED cuando el tipo de compresión no está configurado (se sustituirá la compresión RAW).

El servidor de Navegación segura también utiliza la compresión HTTP estándar para comprimir aún más las respuestas, sin importar el tipo de compresión seleccionado, siempre que el cliente configure el encabezado de compresión HTTP correcto (consulta el artículo de Wikipedia Compresión HTTP).

Compresión Rice

Como se señaló, el servidor de Navegación segura actualmente admite la compresión de Rice (consulta el artículo de Wikipedia sobre codificación Golomb para obtener un análisis completo de la codificación de Golomb-Rice).

Compresión/descompresión

El objeto RiceDeltaEncoding representa los datos codificados en Rice-Golomb y se usa para enviar índices de eliminación comprimidos o prefijos hash de 4 bytes comprimidos. (Los prefijos de hash de más de 4 bytes no se comprimirán y, en su lugar, se entregarán en formato RAW).

Para los índices de eliminación, la lista se ordena en orden ascendente y, luego, se codifica delta mediante la codificación RICE. Para las adiciones, los prefijos de hash de 4 bytes se vuelven a interpretar como uint32s small-endian, se ordenan en sentido ascendente y, luego, se codifican delta mediante la codificación RICE. Ten en cuenta la diferencia en el formato de hash entre la compresión RICE y la RAW: los hashes sin procesar son bytes que se ordenan de manera lexicográfica, mientras que los hashes Rice son uint32s ordenados en orden ascendente (después de la descompresión).

Es decir, la lista de números enteros [1, 5, 7, 13] se codificará como 1 (el primer valor) y los deltas [4, 2, 6].

El primer valor se almacena en el campo firstValue, y los deltas se codifican con un codificador Golomb-Rice. El parámetro k de Rice (ver a continuación) se almacena en riceParameter. El campo numEntries contiene la cantidad de deltas codificados en el codificador de arroz (3 en nuestro ejemplo anterior, no 4). El campo encodedData contiene los deltas codificados reales.

Codificador/decodificador

En el codificador/decodificador de arroz, cada delta n se codifica como q y r, donde n = (q<<k) + r (o, n = q * (2**k) + r). k es una constante y un parámetro del codificador/decodificador de Rice. Los valores para q y r se codifican en la transmisión de bits mediante diferentes esquemas de codificación.

El cociente q está codificado en programación unaria seguida de un 0. Es decir, 3 se codificaría como 1110, 4 como 11110 y 7 como 11111110. Primero, se decodifica el cociente q.

El resto r se codifica usando la codificación binaria truncada. Solo los k bits de r menos significativos se escriben (y, por lo tanto, se leen) desde la transmisión de bits. El resto r se decodifica después de decodificar q.

Codificador/decodificador de bits

El codificador Rice se basa en un codificador/decodificador de bits en el que se pueden agregar bits individuales al codificador de bits; es decir, para codificar un cociente q que podría tener solo dos bits de longitud.

El codificador de bits es una lista de bytes (8 bits). Los bits se establecen desde el bit más bajo en el primer byte hasta el bit más alto en el primer byte. Si un byte ya tiene todos sus bits configurados, se agrega un nuevo byte (inicializado en cero) al final de la lista de bytes. Si el último byte no se usa por completo, sus bits con mayor importancia se establecen en cero. Ejemplo:

Partes agregadas BitEncoder después de agregar bits
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]