압축

이 문서는 Update API (v4): threatListUpdates.fetch 메서드에 적용됩니다.

압축 정보

압축은 세이프 브라우징 API (v4)의 주요 기능입니다. 압축은 대역폭 요구사항을 크게 줄여줍니다. 이는 특히 모바일 기기와 관련이 있지만 이 요구사항만이 아닙니다. 세이프 브라우징 서버는 현재 Rice 압축을 지원합니다. 향후 추가적인 압축 방법이 추가될 수 있습니다.

압축은 supportedCompressions 필드 및 CompressionType을 사용하여 설정합니다. 클라이언트는 RICE 및 RAW 압축 유형을 사용해야 합니다. 압축 유형이 설정되지 않은 경우 세이프 브라우징에서 COMPRESSION_TYPE_UNSPECIFIED 유형을 사용합니다 (RAW 압축이 대체됨).

클라이언트가 올바른 HTTP 압축 헤더를 설정하기만 하면 세이프 브라우징 서버도 표준 HTTP 압축을 사용하여 선택한 압축 유형과 관계없이 응답을 더 압축합니다 (위키백과 문서 HTTP 압축 참조).

Rice 압축

앞서 언급한 바와 같이 세이프 브라우징 서버는 현재 라이스 압축을 지원합니다 (Golomb-라이스 코딩에 대한 자세한 내용은 Golomb 코딩 위키백과 문서 참조).

압축/압축 해제

RiceDeltaEncoding 객체는 Rice-Golomb으로 인코딩된 데이터를 나타내며 압축된 삭제 색인 또는 압축된 4바이트 해시 프리픽스를 보내는 데 사용됩니다. 4바이트를 초과하는 해시 프리픽스는 압축되지 않으며 대신 원시 형식으로 제공됩니다.

삭제 색인의 경우 색인 목록은 오름차순으로 정렬된 후 RICE 인코딩을 사용하여 델타 인코딩됩니다. 또한 4바이트 해시 프리픽스는 Littleendian uint32로 다시 해석되고 오름차순으로 정렬된 후 RICE 인코딩을 사용하여 델타 인코딩됩니다. RICE 압축과 RAW 간의 해시 형식에 차이가 있습니다. 원시 해시는 사전순으로 정렬된 바이트인 반면 Rice 해시는 압축 해제 후 오름차순으로 정렬된 uint32입니다.

즉, 정수 [1, 5, 7, 13] 목록은 1 (첫 번째 값)과 델타 [4, 2, 6]으로 인코딩됩니다.

첫 번째 값은 firstValue 필드에 저장되고 델타는 Golomb-Rice 인코더를 사용하여 인코딩됩니다. Rice 매개변수 k (아래 참고)는 riesParameter에 저장됩니다. numEntries 필드에는 Rice 인코더에서 인코딩된 델타 수가 포함됩니다 (위의 예에서는 4가 아닌 3개). 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은 잘린 바이너리 인코딩을 사용하여 인코딩됩니다. r의 최하위 k 비트만 비트 스트림에서 작성되고 그에 따라 판독됩니다. 나머지 r은 q를 디코딩한 후에 디코딩됩니다.

비트 인코더/디코더

Rice 인코더는 단일 비트를 비트 인코더에 추가할 수 있는 비트 인코더/디코더에 의존합니다. 즉, 길이가 2비트에 불과할 수 있는 몫 q를 인코딩합니다.

비트 인코더는 (8비트) 바이트 목록입니다. 비트는 첫 번째 바이트의 최하위 비트에서 첫 번째 바이트의 최상위 비트로 설정됩니다. 바이트에 모든 비트가 이미 설정되어 있으면 새 바이트 (0으로 초기화됨)가 바이트 목록의 끝에 추가됩니다. 마지막 바이트가 완전히 사용되지 않으면 최상위 비트가 0으로 설정됩니다. 예:

추가된 비트 비트 추가 후 BitEncoder
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]