דחיסה

המסמך הזה רלוונטי לשיטה הבאה: Update API (v4): threatListUpdates.fetch.

מידע על דחיסה

דחיסה היא תכונה מרכזית של ממשקי API של גלישה בטוחה (v4). הדחיסה מפחיתה באופן משמעותי את דרישות רוחב הפס, שרלוונטיות במיוחד למכשירים ניידים, אבל לא רק. השרת של הגלישה הבטוחה תומך כרגע בדחיסת אורז. יכול להיות שנוסיף שיטות דחיסה בעתיד.

הדחיסה מוגדרת באמצעות השדה supportedCompressions ו-CompressionType. הלקוחות צריכים להשתמש בסוגי הדחיסה RICE ו-RICE. התכונה 'גלישה בטוחה' משתמשת בסוג COMPRESSION_TYPE_UNSPECIFIED כשסוג הדחיסה לא מוגדר (דחיסה מסוג RAW תוחלף).

שרת הגלישה הבטוחה ישתמש גם בדחיסת HTTP רגילה כדי להמשיך לדחוס תגובות, ללא קשר לסוג הדחיסה שנבחר, כל עוד הלקוח מגדיר את הכותרת הנכונה לדחיסת HTTP (מידע נוסף זמין במאמר דחיסת HTTP בוויקיפדיה).

דחיסת אורז

כפי שצוין, שרת הגלישה הבטוחה תומך כרגע בדחיסת אורז (במאמר ויקיפדיה בנושא קידוד גולומב בוויקיפדיה, אפשר לקרוא דיון מלא בנושא הקידוד של גולומב-רייס).

דחיסה/ביטול דחיסה

האובייקט RiceDeltaEncoding מייצג את הנתונים בקידוד Rice-Golomb והוא משמש לשליחת אינדקסי הסרה דחוסים או קידומות hash דחוסות בגודל 4 בייטים. (קידומות גיבוב שאורכן עולה על 4 בייטים לא יידחסו, ובמקום זאת הן יוצגו בפורמט גולמי).

כדי להשתמש באינדקסים של הסרה, רשימת האינדקסים ממוינת בסדר עולה ולאחר מכן מקודדת דלתא בקידוד RICE. כשמדובר בתוספות, קידומות hash של 4 בייטים מפורשות מחדש כ-uint32s מעט אנדיאניים, ממוינות בסדר עולה ולאחר מכן מקודדות הדלתא באמצעות קידוד RICE. חשוב לשים לב שיש הבדל בין פורמט הגיבוב בין דחיסת RICE לבין RAW: גיבובים גולמיים הם בייטים ממוינים באופן מילולי, ואילו גיבובי אורז ממוינים בסדר עולה (לאחר ביטול הדחיסה).

כלומר, רשימת המספרים השלמים [1, 5, 7, 13] תקודד כ-1 (הערך הראשון) וכשההפרשים יקודדו [4, 2, 6].

הערך הראשון מאוחסן בשדה firstValue, וההפרשות מקודדות באמצעות מקודד גולומב-רייס. פרמטר Rice k (ראו בהמשך) מאוחסן ב-riceParameter. השדה numEntries מכיל את מספר ההפרשים שקודדו במקודד אורז (3 בדוגמה שלמעלה, לא 4). השדה 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 מקודדת באמצעות קידוד בינארי מקוצר. רק ה-k ביטים הכי פחות משמעותיים של r נכתבים (ולכן נקראים) מהזרם של הביט. השארית r מפוענחת לאחר פענוח q.

מקודד/מפענח ביט

מקודד אורז מסתמך על מקודד/מפענח ביט שבו אפשר לצרף ביטים יחידים למקודד הביטים. כלומר, כדי לקודד מנה במנה q, באורך של שני ביטים בלבד.

מקודד הסיביות הוא רשימה של בייטים (8 ביט). הביטים מוגדרים מהביט המשמעותי הנמוך ביותר בבייט הראשון עד החלק המשמעותי ביותר בבייט הראשון. אם כל הביטים כבר מוגדרים בבייט, בייט חדש (שאותחל לאפס) מצורף לסוף רשימת הבייטים. אם הבייט האחרון לא מנוצל במלואו, הערך הגבוה ביותר של הביטים מקבלים ערך של אפס. דוגמה:

סיביות נוספו BitEncoder אחרי הוספת ביטים
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0 [00101110, 00000000]
1,1,0 [00101110, 00000110]