एलेक्स ने इसे बहुत अच्छी तरह से समझाया है। उन लोगों के लिए जिन्हें अभी भी इस पर बहुत कुछ नहीं मिला है, उम्मीद है कि यह उदाहरण आपको समझने में मदद करेगा:
कहते हैं कि मैं Google के लिए, Chrome टीम में काम करता हूं, और मैं उस ब्राउज़र में एक सुविधा जोड़ना चाहता हूं जो उपयोगकर्ता को सूचित करता है कि उसने जो यूआरएल दर्ज किया है वह दुर्भावनापूर्ण URL है। इसलिए मेरे पास लगभग 1 मिलियन दुर्भावनापूर्ण URL का डेटासेट है, इस फ़ाइल का आकार 25MB के आसपास है। चूंकि आकार काफी बड़ा है, (ब्राउज़र के आकार की तुलना में बड़ा), मैं इस डेटा को एक दूरस्थ सर्वर पर संग्रहीत करता हूं।
केस 1: मैं हैश तालिका के साथ हैश फ़ंक्शन का उपयोग करता हूं। मैं एक कुशल हैशिंग फ़ंक्शन पर निर्णय लेता हूं, और हैश कीज़ प्राप्त करने के लिए हैशिंग फ़ंक्शन के माध्यम से सभी 1 मिलियन यूआरएल चलाते हैं। मैं तब एक हैश तालिका (एक सरणी) बनाता हूं, जहां हैश कुंजी मुझे उस URL को रखने के लिए अनुक्रमणिका देगी। इसलिए अब एक बार जब मैंने हैशिंग टेबल को भर दिया है, तो मैं उसका आकार जांचता हूं। मैंने सभी 1 मिलियन URL को हैश तालिका में उनकी कुंजी के साथ संग्रहीत किया है। तो आकार कम से कम 25 एमबी है। यह हैश तालिका, इसके आकार के कारण एक दूरस्थ सर्वर पर संग्रहीत किया जाएगा। जब कोई उपयोगकर्ता साथ आता है और एड्रेस बार में एक URL दर्ज करता है, तो मुझे यह जांचना होगा कि क्या यह दुर्भावनापूर्ण है। इस प्रकार मैं URL को हैश फ़ंक्शन के माध्यम से चलाता हूं (ब्राउज़र स्वयं ऐसा कर सकता है) और मुझे उस URL के लिए एक हैश कुंजी मिलती है। मुझे अब उस हैश कुंजी के साथ अपने रिमोट सर्वर के लिए एक अनुरोध करना होगा, यह जांचने के लिए कि क्या उस विशेष कुंजी के साथ मेरी हैश तालिका में विशेष URL है, वही है जो उपयोगकर्ता ने दर्ज किया है। यदि हाँ तो यह दुर्भावनापूर्ण है और यदि नहीं तो यह दुर्भावनापूर्ण नहीं है। इस प्रकार हर बार जब उपयोगकर्ता किसी URL में प्रवेश करता है, तो यह देखने के लिए दूरस्थ सर्वर से अनुरोध किया जाता है कि यह दुर्भावनापूर्ण URL है या नहीं। इसमें बहुत समय लगेगा और इस तरह मेरे ब्राउज़र को धीमा कर देगा।
केस 2: मैं एक ब्लूम फ़िल्टर का उपयोग करता हूं। 1 मिलियन URL की पूरी सूची को कई हैश फ़ंक्शंस का उपयोग करके ब्लूम फ़िल्टर के माध्यम से चलाया जाता है और संबंधित पदों को 0 के एक विशाल सरणी में 1 के रूप में चिह्नित किया जाता है। मान लें कि हम ब्लॉम फिल्टर कैलकुलेटर ( http://hur.st/bloomfilter?n=1000000&p=0.01) का उपयोग करके 1% की झूठी सकारात्मक दर चाहते हैं), हम केवल 1.13 एमबी के रूप में आवश्यक ब्लूम फ़िल्टर का आकार प्राप्त करते हैं। इस छोटे आकार की अपेक्षा की जाती है, भले ही सरणी का आकार बहुत बड़ा हो, हम केवल 1s या 0s का भंडारण कर रहे हैं और हैश तालिका के मामले में URL के रूप में नहीं। इस सरणी को थोड़ा सरणी के रूप में माना जा सकता है। यही है, क्योंकि हमारे पास केवल दो मान 1 और 0 हैं, हम बाइट्स के बजाय व्यक्तिगत बिट्स सेट कर सकते हैं। इससे 8 बार लिया गया स्थान कम हो जाएगा। अपने छोटे आकार के कारण यह 1.13 एमबी ब्लूम फ़िल्टर, वेब ब्राउज़र में ही संग्रहीत किया जा सकता है !! इस प्रकार जब कोई उपयोगकर्ता किसी URL के साथ आता है और प्रवेश करता है, तो हम केवल आवश्यक हैश फ़ंक्शंस (ब्राउज़र में ही) लागू करते हैं, और ब्लूम फ़िल्टर (जो ब्राउज़र में संग्रहीत होता है) के सभी पदों की जाँच करते हैं। किसी भी स्थिति में 0 का मान हमें बताता है कि यह URL दुर्भावनापूर्ण URL की सूची में मौजूद नहीं है और उपयोगकर्ता स्वतंत्र रूप से आगे बढ़ सकता है। इस प्रकार हमने सर्वर पर कॉल नहीं किया और इसलिए समय की बचत हुई। 1 का एक मान बताता है कि URL MIGHT दुर्भावनापूर्ण URL की सूची में है। इन मामलों में हम रिमोट सर्वर पर कॉल करते हैं और वहाँ पर हम कुछ हैश तालिका के साथ कुछ अन्य हैश फ़ंक्शन का उपयोग कर सकते हैं क्योंकि URL वास्तव में मौजूद है या नहीं, इसे पुनः प्राप्त करने और जांचने के लिए पहले मामले में। चूंकि अधिकांश समय, URL के दुर्भावनापूर्ण होने की संभावना नहीं होती है, ब्राउज़र के आंकड़ों में छोटा ब्लूम फ़िल्टर बाहर निकलता है और इसलिए दूरस्थ सर्वर पर कॉल से बचकर समय बचाता है। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। इन मामलों में हम रिमोट सर्वर पर कॉल करते हैं और वहाँ पर हम कुछ हैश तालिका के साथ कुछ अन्य हैश फ़ंक्शन का उपयोग कर सकते हैं क्योंकि URL वास्तव में मौजूद है या नहीं, इसे पुनः प्राप्त करने और जांचने के लिए पहले मामले में। चूंकि अधिकांश समय, URL के दुर्भावनापूर्ण होने की संभावना नहीं होती है, ब्राउज़र के आंकड़ों में छोटा ब्लूम फ़िल्टर बाहर निकलता है और इसलिए दूरस्थ सर्वर पर कॉल से बचकर समय बचाता है। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। इन मामलों में हम रिमोट सर्वर पर कॉल करते हैं और वहाँ पर हम कुछ हैश तालिका के साथ कुछ अन्य हैश फ़ंक्शन का उपयोग कर सकते हैं क्योंकि URL वास्तव में मौजूद है या नहीं, इसे पुनः प्राप्त करने और जांचने के लिए पहले मामले में। चूंकि अधिकांश समय, URL के दुर्भावनापूर्ण होने की संभावना नहीं होती है, ब्राउज़र के आंकड़ों में छोटा ब्लूम फ़िल्टर बाहर निकलता है और इसलिए दूरस्थ सर्वर पर कॉल से बचकर समय बचाता है। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। ब्राउज़र में छोटे ब्लॉम फिल्टर जो बाहर निकलते हैं और इसलिए रिमोट सर्वर पर कॉल से बचकर समय की बचत करते हैं। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है। ब्राउज़र में छोटे ब्लॉम फिल्टर जो बाहर निकलते हैं और इसलिए रिमोट सर्वर पर कॉल से बचकर समय की बचत करते हैं। केवल कुछ मामलों में, यदि ब्लूम फ़िल्टर हमें बताता है कि URL MIGHT दुर्भावनापूर्ण है, केवल उन मामलों में हम सर्वर पर कॉल करते हैं। वह That MIGHT ’99% सही है।
इसलिए ब्राउज़र में एक छोटे से ब्लम फ़िल्टर का उपयोग करके, हमने बहुत समय बचाया है क्योंकि हमें दर्ज किए गए प्रत्येक URL के लिए सर्वर कॉल करने की आवश्यकता नहीं है।
हम देख सकते हैं कि एक हैश फ़ंक्शन के साथ हैश टेबल का उपयोग एक अलग उद्देश्य के लिए किया जाता है, जो कि एक ब्लूम फ़िल्टर से अलग होता है। उम्मीद है कि यह आपके संदेह को साफ करता है :)
संपादित करें :
मैंने पायथन में दुर्भावनापूर्ण URL परीक्षण के कार्य के लिए एक ब्लूम फ़िल्टर लागू किया है। कोड यहां पाया जा सकता है - https://github.com/tarunsharma1/Bloom-Filter
कोड समझने में बहुत सरल है और रीडमी फ़ाइल में एक विस्तृत विवरण प्रदान किया गया है।