आप याद कर रहे हैं कि दो डेटा संरचनाएँ हैश टकराव से कैसे निपटती हैं। ब्लूम फ़िल्टर वास्तविक मानों को संग्रहीत नहीं करता है, इसलिए आवश्यक स्थान नामित सरणी का स्थिर आकार है। इसके बजाय यदि आप एक पारंपरिक हैश का उपयोग करते हैं, तो यह आपके द्वारा दिए गए सभी मूल्यों को संग्रहीत करने की कोशिश करता है, इसलिए यह समय के साथ बढ़ता है।
एक सरलीकृत हैश फ़ंक्शन (केवल एक उदाहरण के लिए!) पर विचार करें f(x) = x % 2
। अब आप निम्नलिखित पूर्णांक इनपुट करते हैं 2, 3, 4, 5, 6, 7
:।
स्टैंडर्ड हैश: दिए गए मानों को हैश किया जाएगा, और हम बहुत सारे टकरावों के कारण समाप्त होते हैं f(2) = f(4) = f(6) = 0
और f(3) = f(5) = f(7) = 1
। फिर भी, हैश इन सभी मूल्यों को संग्रहीत करता है और यह आपको यह बताने में सक्षम होगा कि 8
इसमें संग्रहीत नहीं है। इससे ऐसा कैसे होता है? यह टकरावों पर नज़र रखता है और सभी मूल्यों को समान हैश-मूल्य के साथ संग्रहीत करता है, फिर जब आप इसे क्वेरी करते हैं, तो यह आपके क्वेरी की तुलना करता है। तो चलिए मानचित्र के लिए क्वेरी करते हैं 8
: f(8) = 0
तो यह एक बाल्टी में दिखेगा जहाँ हमने पहले ही डाला है 2, 4, 6
और आपको यह बताने के लिए 3 तुलना करने की आवश्यकता है कि 8
इनपुट का हिस्सा नहीं था।
ब्लूम फ़िल्टर: आम तौर पर, प्रत्येक इनपुट मान k
अलग-अलग हैश फ़ंक्शन के खिलाफ हैशेड होता है। फिर से, सादगी के लिए, मान लें कि हम केवल एकल हैश फ़ंक्शन का उपयोग करते हैं f
। हम तो 2 मूल्यों की एक सरणी की जरूरत है और जब हम इनपुट मुठभेड़ 2
यह की वजह से इसका मतलब है कि f(2) = 0
हम स्थिति पर सरणी मान सेट 0
मूल्य के लिए 1
। उसी के लिए होता है 4
और 6
। इसी प्रकार, इनपुट्स 3, 5, 7
प्रत्येक एरे पोज़िशन 1
को वैल्यू पर सेट करते हैं 1
। अब हम प्रश्न करते हैं कि क्या 8
इनपुट का हिस्सा था: f(8) = 0
और स्थिति में सरणी 0
है 1
, इसलिए ब्लूम फ़िल्टर गलत तरीके से दावा करेगा कि 8
वास्तव में इनपुट का हिस्सा था।
थोड़ा और यथार्थवादी होने के लिए, आइए विचार करें कि हम एक दूसरा हैश फ़ंक्शन जोड़ते हैं g(x) = x % 10
। इसी के साथ, इनपुट मूल्य 2
दो हैश मान पर ले जाया जाता f(2) = 0
है और g(2) = 2
और दो संगत सरणी पदों पर निर्धारित किया जाएगा 1
। बेशक, सरणी अब कम से कम आकार की होनी चाहिए 10
। लेकिन जब हम क्वेरी करते हैं 8
तो हम स्थिति के 8
कारण सरणी की जाँच करेंगे g(8) = 8
, और वह स्थिति अभी भी होगी 0
। यही कारण है कि अतिरिक्त हैश फ़ंक्शन आपको प्राप्त होने वाली झूठी सकारात्मकता को कम कर देंगे।
तुलना: ब्लूम फ़िल्टर k
हैश फ़ंक्शंस का उपयोग करता है जिसका अर्थ है k
यादृच्छिक सरणी पदों तक पहुंच प्राप्त करना। लेकिन यह आंकड़ा सटीक है। इसके बजाय हैश केवल आपको एक परिशोधित निरंतर पहुंच समय की गारंटी दे रहा है, लेकिन आपके हैश फ़ंक्शन और इनपुट डेटा की प्रकृति के आधार पर डी-जनरेट कर सकता है। इसलिए यह आम तौर पर तेजी से होता है, डे-जनरेट मामलों को छोड़कर।
हालाँकि, जब आपके पास हैश की टक्कर होती है, तो मानक हैश को क्वेरी मान के विरुद्ध संग्रहीत मानों की समानता की जाँच करनी होगी। यह समानता की जांच मनमाने ढंग से महंगी हो सकती है और कभी भी खिलने वाले फिल्टर के साथ नहीं होगी।
अंतरिक्ष के संदर्भ में, ब्लूम फ़िल्टर स्थिर है, क्योंकि निर्दिष्ट सरणी से अधिक मेमोरी का उपयोग करने की कोई आवश्यकता नहीं है। दूसरी ओर, हैश गतिशील रूप से बढ़ता है और टकराव के मूल्यों का ट्रैक रखने के कारण बहुत बड़ा हो सकता है।
ट्रेड-ऑफ: अब जब आप जानते हैं कि क्या सस्ता है और क्या नहीं और किन परिस्थितियों में आपको ट्रेड-ऑफ को देखने में सक्षम होना चाहिए। ब्लूम फ़िल्टर महान हैं यदि आप बहुत जल्दी पता लगाना चाहते हैं कि एक मूल्य पहले देखा गया है, लेकिन झूठी सकारात्मकता के साथ रह सकते हैं। दूसरी ओर, आप हैश मैप का चयन कर सकते हैं यदि आप अपने रनटाइम का न्याय करने में सक्षम नहीं होने की कीमत पर शुद्धता की गारंटी चाहते हैं, लेकिन कभी-कभी पतले मामलों को स्वीकार कर सकते हैं जो औसत से बहुत धीमा हो सकता है।
इसी तरह, यदि आप एक सीमित मेमोरी वातावरण पर हैं, तो आप उनकी मेमोरी उपयोग गारंटी के लिए ब्लूम फ़िल्टर को प्राथमिकता देना चाह सकते हैं।