संपीड़न

यह दस्तावेज़ इस तरीके पर लागू होता है: Update API (v4): threatListUpdates.fetch.

कंप्रेस करने के बारे में जानकारी

कंप्रेस करना, सुरक्षित ब्राउज़िंग एपीआई (v4) की एक मुख्य सुविधा है. कंप्रेशन, बैंडविड्थ की ज़रूरत को काफ़ी कम कर देता है. यह खास तौर पर मोबाइल डिवाइसों के लिए ज़रूरी नहीं है, लेकिन खास तौर पर इसके लिए ज़रूरी नहीं है. फ़िलहाल, सुरक्षित ब्राउज़िंग सर्वर पर चावलों को कंप्रेस करने की सुविधा काम करती है. आने वाले समय में, कंप्रेस करने के और तरीके जोड़े जा सकते हैं.

कंप्रेस करने की सुविधा को, supportedCompressions फ़ील्ड और CompressionType का इस्तेमाल करके सेट किया जाता है. क्लाइंट को RICE और RAW कंप्रेशन टाइप का इस्तेमाल करना चाहिए. जब कंप्रेस करने का टाइप सेट नहीं होता है, तब सुरक्षित ब्राउज़िंग में, COMPRESSION_TYPE_UNSPECIFIED टाइप का इस्तेमाल किया जाता है. इसकी जगह, RAW कंप्रेशन का इस्तेमाल किया जाएगा.

सुरक्षित ब्राउज़िंग सर्वर, रिस्पॉन्स को और कंप्रेस करने के लिए स्टैंडर्ड एचटीटीपी कंप्रेशन का भी इस्तेमाल करेगा. इससे फ़र्क़ नहीं पड़ता कि कंप्रेस करने का टाइप कोई भी है या नहीं. हालांकि, ऐसा तब ही होगा, जब क्लाइंट सही एचटीटीपी कंप्रेस करने वाला हेडर सेट करेगा. ज़्यादा जानकारी के लिए, Wikipedia लेख एचटीटीपी कंप्रेस करना देखें.

चावल को कंप्रेस करना

जैसा कि बताया गया है, सुरक्षित ब्राउज़िंग सर्वर फ़िलहाल राइस कंप्रेस करने की सुविधा देता है. Golomb-Rice कोडिंग के बारे में पूरी जानकारी पाने के लिए, Wikipedia लेख Golomb कोडिंग देखें.

कंप्रेस करना/डिकंप्रेस करना

RiceDeltaEncoding ऑब्जेक्ट, Rice-Golomb से कोड में बदले गए डेटा को दिखाता है. इसका इस्तेमाल, कंप्रेस किए गए रिमूवल इंडेक्स या 4-बाइट हैश प्रीफ़िक्स को भेजने के लिए किया जाता है. (चार बाइट से ज़्यादा लंबे हैश प्रीफ़िक्स कंप्रेस नहीं किए जाएंगे. इन्हें रॉ फ़ॉर्मैट में ही दिखाया जाएगा.)

हटाए गए इंडेक्स के लिए, इंडेक्स की सूची को बढ़ते क्रम में लगाया जाता है. इसके बाद, आरआईसीई कोड में बदलने के तरीके का इस्तेमाल करके डेल्टा को कोड में बदला जाता है. जोड़ने के लिए, 4-बाइट वाले हैश प्रीफ़िक्स को लिटिल-एंडियन uint32s के तौर पर फिर से समझा जाता है. इन्हें बढ़ते क्रम में लगाया जाता है. इसके बाद, आरआईसीई एन्कोडिंग का इस्तेमाल करके डेल्टा को कोड में बदला जाता है. आरआईसीई कंप्रेशन और रॉ के बीच हैश फ़ॉर्मैट के अंतर पर ध्यान दें: रॉ हैश फ़ॉर्मैट, डेटा की मदद से, बाइट में क्रम से लगाए जाते हैं, जबकि राइस हैश को uint32s, बढ़ते क्रम में (डिकंप्रेशन के बाद) क्रम से लगाया जाता है.

इसका मतलब है कि पूर्णांकों की सूची [1, 5, 7, 13] को 1 (पहली वैल्यू) और डेल्टा [4, 2, 6] के तौर पर एन्कोड किया जाएगा.

पहली वैल्यू firstValue फ़ील्ड में सेव की जाती है और डेल्टा को Golomb-Rice एन्कोडर का इस्तेमाल करके एन्कोड किया जाता है. चावल पैरामीटर k (नीचे देखें) को rice पैरामीटर में सेव किया जाता है. numEntries फ़ील्ड में, चावल के एन्कोडर में एन्कोड किए गए डेल्टा की संख्या होती है (ऊपर दिए गए उदाहरण में तीन, नहीं 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 को कम की गई बाइनरी एन्कोडिंग का इस्तेमाल करके एन्कोड किया जाता है. बिट स्ट्रीम में, r के सिर्फ़ सबसे कम महत्वपूर्ण k बिट लिखे जाते हैं (और इसलिए पढ़े जाते हैं). q को डिकोड करने के बाद, बाकी के r को डिकोड किया जाता है.

बिट एन्कोडर/डीकोडर

चावल का एन्कोडर, बिट एन्कोडर/डीकोडर का इस्तेमाल करता है, जहां बिट एन्कोडर में सिंगल बिट को जोड़ा जा सकता है. इसका मतलब है कि इसे दो बिट की अवधि वाले भागफल के कोड में बदला जा सकता है.

बिट एन्कोडर (8-बिट) बाइट की सूची होती है. बिट को पहले बाइट की सबसे अहम बिट से, पहले बाइट के सबसे ज़्यादा अहम बिट पर सेट किया जाता है. अगर किसी बाइट के सभी बिट पहले से सेट हैं, तो बाइट सूची के आखिर में एक नया बाइट (शून्य से शुरू होने वाला) जुड़ जाता है. अगर लास्ट बाइट पूरी तरह इस्तेमाल नहीं किया गया है, तो इसके सबसे अहम बिट शून्य पर सेट कर दिए जाते हैं. उदाहरण:

बिट जोड़े गए बिट जोड़ने के बाद BitEncoder
[]
0 [00,00,000]
1 [00,00,0010]
1 [00000110]
1,00,1 [00101110]
0,00,000 [00101110, 00,00,000]
1,1,0 [00101110, 00000110]