Kompresja

Ten dokument dotyczy tej metody:Aktualizacja interfejsu API (wersja 4):threatListUpdates.fetch.

Kompresja

Kompresja to kluczowa funkcja interfejsów API bezpiecznego przeglądania (wersja 4). Kompresja znacznie zmniejsza wymagania dotyczące przepustowości, co jest szczególnie istotne w przypadku urządzeń mobilnych, ale nie tylko. Serwer Bezpiecznego przeglądania obsługuje obecnie kompresję Rice. W przyszłości możemy dodać dodatkowe metody kompresji.

Kompresję ustawia się za pomocą pola supportedCompressionsCompressionType. Klienci powinni używać typów kompresji RICE i RAW. Bezpieczne przeglądanie używa typu COMPRESSION_TYPE_UNSPECIFIED, gdy typ kompresji nie jest ustawiony (zostanie zastąpiony kompresją RAW).

Serwer Bezpiecznego przeglądania będzie też używać standardowej kompresji HTTP do dalszego kompresowania odpowiedzi, niezależnie od wybranego typu kompresji, o ile klient ustawi prawidłowy nagłówek kompresji HTTP (patrz artykuł w Wikipedii Kompresja HTTP).

Kompresja ryżu

Jak wspomnieliśmy, serwer Bezpiecznego przeglądania obsługuje obecnie kompresję Rice (pełne omówienie kodowania Golomba-Rice znajdziesz w artykule w Wikipedii na temat kodowania Golomba).

Kompresja/dekompresja

Obiekt RiceDeltaEncoding reprezentuje dane zakodowane za pomocą kodowania Rice-Golomb i jest używany do wysyłania skompresowanych indeksów usuwania lub skompresowanych 4-bajtowych prefiksów skrótu. (Prefiksy skrótu dłuższe niż 4 bajty nie będą kompresowane i zamiast tego będą wyświetlane w formacie surowym).

W przypadku indeksów usuwania lista indeksów jest sortowana w kolejności rosnącej, a następnie kodowana metodą delta przy użyciu kodowania RICE. W przypadku dodatków 4-bajtowe przedrostki skrótu są ponownie interpretowane jako liczby uint32 w formacie little-endian, sortowane w kolejności rosnącej, a następnie kodowane różnicowo przy użyciu kodowania RICE. Zwróć uwagę na różnicę w formacie skrótu między kompresją RICE a RAW: surowe skróty to posortowane leksykograficznie bajty, a skróty Rice to liczby uint32 posortowane w kolejności rosnącej (po dekompresji).

Oznacza to, że lista liczb całkowitych [1, 5, 7, 13] zostanie zakodowana jako 1 (pierwsza wartość) i różnice [4, 2, 6].

Pierwsza wartość jest przechowywana w polu firstValue, a wartości delta są kodowane za pomocą kodera Golomb-Rice. Parametr k (patrz poniżej) jest przechowywany w zmiennej riceParameter. Pole numEntries zawiera liczbę różnic zakodowanych w koderze Rice’a (w naszym przykładzie powyżej jest to 3, a nie 4). Pole encodedData zawiera rzeczywiste zakodowane różnice.

Koder/dekoder

W koderze/dekoderze Rice każda wartość delta n jest kodowana jako q i r, gdzie n = (q<<k) + r (lub n = q * (2**k) + r). k jest stałą i parametrem kodera/dekodera Rice. Wartości q i r są kodowane w strumieniu bitów przy użyciu różnych schematów kodowania.

Iloraz q jest kodowany w systemie binarnym, po którym następuje 0. Oznacza to, że 3 zostanie zakodowane jako 1110, 4 jako 11110, a 7 jako 11111110. Najpierw dekodowany jest iloraz q.

Reszta r jest kodowana przy użyciu skróconego kodowania binarnego. Z strumienia bitów zapisywane (a tym samym odczytywane) jest tylko k najmniej znaczących bitów liczby r. Reszta r jest dekodowana po zdekodowaniu q.

Koder/dekoder bitów

Koder Rice opiera się na koderze/dekoderze bitowym, do którego można dołączać pojedyncze bity. Oznacza to, że można zakodować iloraz q, który może mieć tylko 2 bity.

Koder bitów to lista bajtów (8-bitowych). Bity są ustawiane od najmniej znaczącego bitu w pierwszym bajcie do najbardziej znaczącego bitu w pierwszym bajcie. Jeśli wszystkie bity bajtu są już ustawione, na końcu listy bajtów dodawany jest nowy bajt (zainicjowany wartością zero). Jeśli ostatni bajt nie jest w pełni wykorzystany, jego najbardziej znaczące bity są ustawione na zero. Przykład:

Dodane bity BitEncoder After Adding Bits
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]