Этот документ относится к следующему методу: 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] |