Сжатие

Этот документ относится к следующему методу: API обновления (v4) : ThreatListUpdates.fetch .

О сжатии

Сжатие — ключевая функция API безопасного просмотра (v4). Сжатие значительно снижает требования к пропускной способности, что особенно, но не исключительно, актуально для мобильных устройств. Сервер безопасного просмотра в настоящее время поддерживает сжатие Rice. В будущем могут быть добавлены дополнительные методы сжатия.

Сжатие задается с помощью поля supportCompressions и CompressionType . Клиенты должны использовать типы сжатия RICE и RAW. Безопасный просмотр использует тип COMPRESSION_TYPE_UNSPECIFIED, если тип сжатия не установлен (заменяется сжатием RAW).

Сервер безопасного просмотра также будет использовать стандартное HTTP-сжатие для дальнейшего сжатия ответов независимо от выбранного типа сжатия, если клиент устанавливает правильный заголовок HTTP-сжатия (см. статью Википедии «HTTP-сжатие »).

Сжатие риса

Как уже отмечалось, сервер безопасного просмотра в настоящее время поддерживает сжатие Райса (полное обсуждение кодирования Голомба -Райса см. в статье Википедии «Кодирование Голомба»).

Сжатие/декомпрессия

Объект RiceDeltaEncoding представляет данные в кодировке Райса-Голомба и используется для отправки сжатых индексов удаления или сжатых 4-байтовых хэш-префиксов. (Хеш-префиксы длиной более 4 байтов не будут сжиматься и вместо этого будут обслуживаться в необработанном формате.)

Для индексов удаления список индексов сортируется в порядке возрастания, а затем дельта-кодируется с использованием кодировки RICE. Кроме того, 4-байтовые хэш-префиксы переинтерпретируются как uint32 с прямым порядком байтов, сортируются в порядке возрастания, а затем дельта-кодируются с использованием кодировки RICE. Обратите внимание на разницу в формате хеша между сжатием RICE и RAW: необработанные хэши представляют собой лексикографически отсортированные байты, тогда как хеши Райса представляют собой uint32, отсортированные в порядке возрастания (после распаковки).

То есть список целых чисел [1, 5, 7, 13] будет закодирован как 1 (первое значение) и дельты [4, 2, 6].

Первое значение сохраняется в поле firstValue , а дельты кодируются с помощью кодера Голомба-Райса. Параметр Райса k (см. ниже) хранится в рисеParameter. Поле numEntries содержит количество дельт, закодированных в кодировщике Райса (3 в нашем примере выше, а не 4). Поле encodedData содержит фактические закодированные отклонения.

Кодер/декодер

В кодере/декодере Райса каждая дельта n кодируется как q и r, где n = (q<<k) + r (или n = q * (2**k) + r). k — константа и параметр кодера/декодера Райса. Значения q и r кодируются в битовом потоке с использованием различных схем кодирования.

Частное q кодируется унарным кодом, за которым следует 0. То есть 3 будет закодировано как 1110, 4 — как 11110, а 7 — как 11111110. Сначала декодируется частное q.

Остаток r кодируется с использованием усеченного двоичного кодирования. Только младшие k бит r записываются (и, следовательно, считываются) из потока битов. Остаток r декодируется после декодирования q.

Битовый кодер/декодер

Кодер Райса использует битовый кодер/декодер, где к битовому кодировщику можно добавлять отдельные биты; то есть для кодирования частного q, длина которого может составлять всего два бита.

Битовый кодер представляет собой список (8-битных) байтов. Биты устанавливаются от младшего значащего бита в первом байте до старшего значащего бита в первом байте. Если все биты байта уже установлены, новый байт (инициализированный нулем) добавляется в конец списка байтов. Если последний байт не используется полностью, его старшие значащие биты устанавливаются в ноль. Пример:

Биты добавлены BitEncoder после добавления битов
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]