Nén

Tài liệu này áp dụng cho phương thức sau: Cập nhật API (v4): threatListUpdates.fetch.

Giới thiệu về quá trình nén

Nén là một tính năng chính của API Duyệt web an toàn (phiên bản 4). Việc nén làm giảm đáng kể yêu cầu về băng thông, đặc biệt nhưng không chỉ áp dụng cho thiết bị di động. Máy chủ Duyệt web an toàn hiện hỗ trợ chức năng nén Gạo. Các phương thức nén khác có thể sẽ được thêm vào trong tương lai.

Chế độ nén được thiết lập bằng trường supportedCompressions (được hỗ trợ) và CompressionType. Khách hàng nên sử dụng các loại nén RICE và RAW. Duyệt web an toàn sử dụng loại CompRESSION_TYPE_UNSPECIFICified khi loại nén không được đặt (nén RAW sẽ được thay thế).

Máy chủ Duyệt web an toàn cũng sẽ sử dụng tính năng nén HTTP tiêu chuẩn để nén thêm các phản hồi, bất kể loại nén đã chọn là gì, miễn là ứng dụng đặt đúng tiêu đề nén HTTP (xem bài viết nén HTTP trên Wikipedia).

Nắm gạo

Như đã lưu ý, máy chủ Duyệt web an toàn hiện hỗ trợ tính năng nén Gạo (xem bài viết Lập trình Golomb trên Wikipedia để tìm hiểu đầy đủ nội dung thảo luận về lập trình Golomb-Rice).

Nén/giải nén

Đối tượng RiceDeltaEncoding đại diện cho dữ liệu đã mã hoá Gạo gạo-Golomb và được dùng để gửi các chỉ mục xóa nén hoặc tiền tố băm nén 4 byte. (Tiền tố hàm băm dài hơn 4 byte sẽ không được nén và sẽ được phân phát ở định dạng thô.)

Đối với các chỉ mục xoá, danh sách các chỉ mục được sắp xếp theo thứ tự tăng dần, sau đó được mã hoá delta bằng phương thức mã hoá RICE. Để bổ sung, các tiền tố băm 4 byte sẽ được diễn giải lại dưới dạng uint32 nhỏ, được sắp xếp theo thứ tự tăng dần và sau đó delta được mã hoá bằng phương thức mã hoá RICE. Hãy lưu ý sự khác biệt về định dạng băm giữa định dạng nén RICE và RAW: hàm băm thô là các byte được sắp xếp theo từ ngữ, trong khi hàm băm gạo được sắp xếp theo thứ tự tăng dần (sau khi giải nén).

Tức là danh sách các số nguyên [1, 5, 7, 13] sẽ được mã hoá thành 1 (giá trị đầu tiên) và delta [4, 2, 6].

Giá trị đầu tiên được lưu trữ trong trường firstValue và các delta được mã hoá bằng bộ mã hoá Golomb-Rice. Tham số lúa k (xem bên dưới) được lưu trữ trong GạoTham số. Trường numEntries chứa số delta được mã hoá trong bộ mã hoá gạo (3 trong ví dụ của chúng tôi, không phải 4). Trường encodedData chứa các delta được mã hoá thực tế.

Bộ mã hoá/bộ giải mã

Trong bộ mã hoá/bộ giải mã Gạo, mọi delta n được mã hoá dưới dạng q và r, trong đó n = (q<<k) + r (hoặc n = q * (2**k) + r). k là hằng số và là tham số của bộ mã hoá/bộ giải mã gạo. Các giá trị của q và r được mã hoá trong luồng bit bằng các lược đồ mã hoá khác nhau.

Thương số q được mã hoá bằng mã đơn vị theo sau là số 0. Nghĩa là, 3 sẽ được mã hoá là 1110, 4 là 11110 và 7 là 11111110. Thương số q được giải mã trước tiên.

Phần còn lại r được mã hoá bằng phương thức mã hoá nhị phân bị cắt bớt. Chỉ có k bit có ý nghĩa nhỏ nhất của r được ghi (và do đó đọc) từ luồng bit. Phần còn lại r sẽ được giải mã sau khi đã giải mã q.

Bộ mã hoá/bộ giải mã bit

Bộ mã hoá gạo dựa trên bộ mã hoá/bộ giải mã bit, trong đó bạn có thể nối các bit đơn vào bộ mã hoá bit; nghĩa là để mã hoá một thương số chỉ có thể dài 2 bit.

Bộ mã hoá bit là một danh sách các byte (8 bit). Các bit được đặt từ bit có ý nghĩa thấp nhất trong byte đầu tiên đến bit có ý nghĩa cao nhất trong byte đầu tiên. Nếu một byte đã đặt sẵn tất cả các bit, thì một byte mới (khởi tạo bằng 0) sẽ được thêm vào cuối danh sách byte. Nếu byte cuối cùng không được sử dụng đầy đủ, các bit có nghĩa cao nhất của byte sẽ được đặt thành 0. Ví dụ:

Đã thêm bit BitEncoder sau khi thêm bit
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]