Kompresja

Ten dokument dotyczy tej metody: Update API (v4): threatListUpdates.fetch.

Kompresja

Kompresja to kluczowa funkcja interfejsów API Bezpiecznego przeglądania (v4). Kompresja znacznie zmniejsza wymagania związane z przepustowością, co ma szczególne znaczenie na urządzeniach mobilnych, ale nie tylko. Serwer Bezpiecznego przeglądania obsługuje obecnie kompresję ryżu. W przyszłości możemy dodać więcej metod kompresji.

Kompresja ustawia się za pomocą pola supportedCompressions (obsługiwane kompresje) i CompressionType. Klienci powinni używać kompresji RICE i RAW. Bezpieczne przeglądanie używa typu COMPRESSION_TYPE_UNSPECIFIED, gdy nie jest ustawiony typ kompresji (zastąpiona jest kompresja RAW).

Serwer Bezpiecznego przeglądania stosuje też standardową kompresję HTTP, aby dodatkowo kompresować odpowiedzi niezależnie od wybranego typu kompresji, o ile klient ustawi prawidłowy nagłówek kompresji HTTP (patrz artykuł o kompresji HTTP w Wikipedii).

Kompresja ryżowa

Jak już wspomnieliśmy, serwer Bezpiecznego przeglądania obsługuje obecnie kompresję ryżu (więcej informacji o kodowaniu w Golomb-Rice znajdziesz w artykule Kodowanie w Golomb).

Kompresja/dekompresja

Obiekt RiceDeltaEncoding reprezentuje dane zakodowane w postaci ryżu-Golomb i służy do wysyłania skompresowanych indeksów usuwania lub skompresowanych 4-bajtowych prefiksów skrótów. Prefiksy haszu dłuższe niż 4 bajty nie będą kompresowane i zamiast tego będą wyświetlane w formacie nieprzetworzonym.

W przypadku indeksów usunięcia lista indeksów jest posortowana w kolejności rosnącej, a następnie kodowana delta z użyciem kodowania RICE. W przypadku dodania 4-bajtowe prefiksy skrótu są interpretowane jako little-endian uint32, posortowane w kolejności rosnącej, a następnie kodowane delta z użyciem kodowania RICE. Zwróć uwagę na różnicę w formacie skrótu między kompresją RICE a RAW: nieprzetworzone hasze to bajty posortowane leksykograficznie, natomiast hasze ryżu są 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 delta [4, 2, 6].

Pierwsza wartość jest przechowywana w polu firstValue, a delta jest kodowana za pomocą enkodera Golomb-Rice. Parametr k ryżu (patrz poniżej) jest przechowywany w parametrze riceParameter. Pole numEntries zawiera liczbę delta zakodowanych w koderze ryżu (3 w naszym przykładzie, a nie 4). Pole encodedData zawiera rzeczywiście zakodowane delta.

Koder/dekoder

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

Iloczyn q jest kodowany jako kod jednoargumentowy, po którym następuje 0. Oznacza to, że 3 zostanie zakodowany jako 1110, 4 jako 11110, a 7 jako 11111110. Najpierw dekodowany jest iloraz q.

Pozostała część r jest kodowana przy użyciu obciętego kodowania binarnego. Ze strumienia bitów zapisywane są (a tym samym odczytywane) tylko najmniej istotne k bitów argumentu r. Reszta r jest dekodowana po zdekodowaniu q.

Koder/dekoder bitowy

Enkoder Rice korzysta z enkodera/dekodera bitów, w którym pojedyncze bity można dołączyć do kodera bitów, czyli aby zakodować iloraz q, który może mieć tylko 2 bity.

Koder bitów ma postać listy (8-bitowych) bajtów. Bity są ustawiane od najniższego bitu istotnego w pierwszym bajcie do najwyższego bitu istotnego w pierwszym bajcie. Jeśli bajt ma już ustawione wszystkie bity, na końcu listy bajtów zostanie dodany nowy bajt (zainicjowany do zera). Jeśli ostatni bajt nie jest w pełni wykorzystany, jego najwyższe bity istotne są ustawiane na 0. Przykład:

Dodane bity BitEncoder po dodaniu bitów
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]