संपीड़न

यह दस्तावेज़ इस तरीके पर लागू होता है: एपीआई (v4) अपडेट करें: threatListUpdates.fetch.

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

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

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

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

चावल को दबाना

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

कंप्रेशन/डीकंप्रेशन

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

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

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

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

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

राइस एन्कोडर, बिट एन्कोडर/डिकोडर पर निर्भर करता है. इसमें बिट एन्कोडर में सिंगल बिट जोड़े जा सकते हैं. इसका मतलब है कि सिर्फ़ दो बिट लंबे भागफल q को एन्कोड किया जा सकता है.

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

जोड़े गए बिट्स बिट जोड़ने के बाद BitEncoder
[]
0 [00000000]
1 [00000010]
1 [00000110]
1,0,1 [00101110]
0,0,0 [00101110, 00000000]
1,1,0 [00101110, 00000110]