Tài liệu này áp dụng cho phương thức sau: Update API (v4): threatListUpdates.fetch.
Giới thiệu về tính năng 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 giúp giảm đáng kể yêu cầu về băng thông, điều này đặc biệt (nhưng không chỉ) phù hợp với thiết bị di động. Máy chủ Duyệt web an toàn hiện hỗ trợ phương thức nén Rice. Các phương pháp nén khác có thể được thêm vào trong tương lai.
Bạn có thể thiết lập chế độ nén bằng cách sử dụng trường supportedCompressions và CompressionType. Khách hàng nên sử dụng các loại nén RICE và RAW. Tính năng Duyệt web an toàn sử dụng loại COMPRESSION_TYPE_UNSPECIFIED khi loại nén chưa được đặt (phương thức 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 nào được chọn, miễn là ứng dụng đặt tiêu đề nén HTTP chính xác (xem bài viết Nén HTTP trên Wikipedia).
Nén bằng thuật toán Rice
Như đã lưu ý, máy chủ Duyệt web an toàn hiện hỗ trợ tính năng nén Rice (xem bài viết Mã hoá Golomb trên Wikipedia để biết toàn bộ nội dung thảo luận về mã hoá Golomb-Rice).
Nén/giải nén
Đối tượng RiceDeltaEncoding biểu thị dữ liệu được mã hoá Rice-Golomb và được dùng để gửi các chỉ mục xoá đã nén hoặc các tiền tố băm 4 byte đã nén. (Các 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 chỉ mục xoá, danh sách chỉ mục được sắp xếp theo thứ tự tăng dần rồi mã hoá delta bằng cách sử dụng phương thức mã hoá RICE. Đối với các mục bổ sung, tiền tố băm 4 byte sẽ được diễn giải lại thành uint32 có thứ tự byte nhỏ, được sắp xếp theo thứ tự tăng dần, sau đó được mã hoá delta bằng cách sử dụng phương thức mã hoá RICE. Lưu ý sự khác biệt về định dạng băm giữa phương thức nén RICE và RAW: hàm băm thô là các byte được sắp xếp theo thứ tự từ điển, trong khi hàm băm Rice là uint32 được sắp xếp theo thứ tự tăng dần (sau khi giải nén).
Tức là danh sách số nguyên [1, 5, 7, 13] sẽ được mã hoá thành 1 (giá trị đầu tiên) và các số gia [4, 2, 6].
Giá trị đầu tiên được lưu trữ trong trường firstValue
và các giá trị chênh lệch được mã hoá bằng bộ mã hoá Golomb-Rice. Tham số k của Rice (xem bên dưới) được lưu trữ trong riceParameter. Trường numEntries
chứa số lượng delta được mã hoá trong bộ mã hoá Rice (3 trong ví dụ trên, không phải 4). Trường encodedData
chứa các phần chênh lệch được mã hoá thực tế.
Bộ mã hoá/giải mã
Trong bộ mã hoá/giải mã Rice, mọi delta n đều được mã hoá dưới dạng q và r, trong đó n = (q<<k) + r (hoặc n = q * (2**k) + r). k là một hằng số và là một tham số của bộ mã hoá/giải mã Rice. Các giá trị cho q và r được mã hoá trong luồng bit bằng các sơ đồ mã hoá khác nhau.
Thương q được mã hoá bằng mã hoá đơn vị theo sau là 0. Tức là 3 sẽ được mã hoá thành 1110, 4 thành 11110 và 7 thành 11111110. Trước tiên, thương q sẽ được giải mã.
Số dư r được mã hoá bằng phương pháp mã hoá nhị phân bị cắt. Chỉ k bit ít quan trọng nhất của r được ghi (và do đó được đọc) từ luồng bit. Số dư r được giải mã sau khi giải mã q.
Bộ mã hoá/giải mã bit
Bộ mã hoá Rice dựa vào bộ mã hoá/giải mã bit, trong đó các bit đơn có thể được thêm vào bộ mã hoá bit; tức là để mã hoá một thương q 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 tất cả các bit của nó, thì một byte mới (được khởi tạo thành 0) sẽ được nối vào cuối danh sách byte. Nếu byte cuối cùng chưa được sử dụng hết, thì các bit có nghĩa cao nhất của byte đó sẽ được đặt thành 0. Ví dụ:
Đã thêm Bit | BitEncoder After Adding Bits |
---|---|
[] | |
0 | [00000000] |
1 | [00000010] |
1 | [00000110] |
1,0,1 | [00101110] |
0,0,0 | [00101110, 00000000] |
1,1,0 | [00101110, 00000110] |