המסמך הזה רלוונטי ל-method הבא: Update API (גרסה 4): threatListUpdates.fetch.
מידע על דחיסה
דחיסה היא תכונה מרכזית של ממשקי ה-API של גלישה בטוחה (גרסה 4). דחיסה מצמצמת באופן משמעותי את הדרישות של רוחב הפס, וזה חשוב במיוחד למכשירים ניידים, אבל לא רק להם. שרת בטיחות הגלישה תומך כרגע בדחיסת Rice. יכול להיות שנוסיף בעתיד שיטות דחיסה נוספות.
הדחיסה מוגדרת באמצעות השדה supportedCompressions ו-CompressionType. הלקוחות צריכים להשתמש בסוגי הדחיסה RICE ו-RAW. התכונה 'גלישה בטוחה' משתמשת בסוג COMPRESSION_TYPE_UNSPECIFIED כשסוג הדחיסה לא מוגדר (תתבצע החלפה בדחיסה מסוג RAW).
שרת הגלישה הבטוחה ישתמש גם בדחיסת HTTP רגילה כדי לדחוס עוד יותר את התגובות, ללא קשר לסוג הדחיסה שנבחר, כל עוד הלקוח מגדיר את כותרת הדחיסה הנכונה של HTTP (ראו את המאמר ב-Wikipedia בנושא דחיסת HTTP).
דחיסת אורז
כמו שצוין, שרת הגלישה הבטוחה תומך כרגע בדחיסת Rice (במאמר Golomb coding בוויקיפדיה יש דיון מלא בנושא קידוד Golomb-Rice).
דחיסה/פריסה
האובייקט RiceDeltaEncoding מייצג את הנתונים שמקודדים ב-Rice-Golomb ומשמש לשליחת אינדקסים דחוסים של הסרת נתונים או קידומות דחוסות של גיבוב (hash) באורך 4 בייט. (קידומות של hash שאורכן גדול מ-4 בייטים לא יידחסו, ויוצגו בפורמט גולמי במקום זאת).
במקרה של אינדקסים להסרה, רשימת האינדקסים ממוינת בסדר עולה ואז מקודדת באמצעות קידוד דלתא (delta encoding) בקידוד RICE. במקרה של תוספות, הקידומות של הגיבוב (hash) באורך 4 בייטים מפורשות מחדש כמספרים שלמים לא מסומנים (uint32) בשיטת Little Endian, ממוינות בסדר עולה ואז מקודדות באמצעות קידוד דלתא בשיטת RICE. שימו לב להבדל בפורמט הגיבוב בין דחיסת RICE לבין RAW: גיבובי RAW הם בייטים ממוינים לפי סדר מילוני, בעוד שגיבובי Rice הם uint32s ממוינים בסדר עולה (אחרי הפענוח).
כלומר, הרשימה של המספרים השלמים [1, 5, 7, 13] תהיה מקודדת כ-1 (הערך הראשון) וההפרשים [4, 2, 6].
הערך הראשון מאוחסן בשדה firstValue
והדלתאות מקודדות באמצעות מקודד Golomb-Rice. הפרמטר k של Rice (ראו בהמשך) מאוחסן ב-riceParameter. השדה numEntries
מכיל את מספר הדלתאות שמקודדות במקודד Rice (3 בדוגמה שלמעלה, לא 4). השדה encodedData
מכיל את הדלתאות המקודדות בפועל.
מקודד/מפענח
במקודד/מפענח של Rice, כל דלתא n מקודדת כ-q ו-r, כאשר n = (q<<k) + r (או, n = q * (2**k) + r). k הוא קבוע ופרמטר של המקודד/מפענח של Rice. הערכים של q ו-r מקודדים בזרם הביטים באמצעות סכימות קידוד שונות.
המנה q מקודדת בקידוד אונרי ואחריה 0. כלומר, 3 יקודד כ-1110, 4 כ-11110 ו-7 כ-11111110. המנה q מפוענחת קודם.
השארית r מקודדת באמצעות קידוד בינארי קטום. רק k הביטים הכי פחות משמעותיים של r נכתבים (ולכן נקראים) מזרם הביטים. השארית r מפוענחת אחרי ש-q פוענח.
מקודד/מפענח של ביטים
מקודד Rice מסתמך על מקודד/מפענח ביטים שבו אפשר לצרף ביטים בודדים למקודד הביטים, כלומר, כדי לקודד מנה q שיכולה להיות באורך של שני ביטים בלבד.
מקודד הביטים הוא רשימה של בייטים (8 ביט). הביטים מוגדרים מהביט הכי פחות משמעותי בבייט הראשון ועד הביט הכי משמעותי בבייט הראשון. אם כל הביטים של בייט מסוים כבר מוגדרים, בייט חדש (מאותחל לאפס) מצורף לסוף רשימת הבייטים. אם הבייט האחרון לא בשימוש מלא, הביטים המשמעותיים ביותר שלו מוגדרים לאפס. דוגמה:
ראשים שנוספו | BitEncoder After Adding Bits |
---|---|
[] | |
0 | [00000000] |
1 | [00000010] |
1 | [00000110] |
1,0,1 | [00101110] |
0,0,0 | [00101110, 00000000] |
1,1,0 | [00101110, 00000110] |