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] |