क्या ब्लड फ़िल्टर वास्तव में हैश की तुलना में तेज़ होते हैं, यहाँ तक कि खाता कैश में भी?


16

ब्लूम फ़िल्टर वास्तव में बहुत अच्छे लगते हैं जब आप विचार करते हैं कि आप यह निर्धारित कर सकते हैं कि एक इंट निरंतर समय में 99% निश्चितता के साथ सेट है। लेकिन इतना हैश, एकमात्र अंतर के साथ, एक हैश में, अधिकांश समय आप केवल एक बार मेमोरी एक्सेस कर रहे हैं। ब्लूम फ़िल्टर के साथ, आपको उन्हें पूरी तरह से दूर के स्थानों में प्रति अनुरोध 7 बार एक्सेस करने की आवश्यकता होती है , इसलिए आपके पास प्रति अनुरोध कई कैश मिसेज़ होंगे।

क्या मैं कुछ भूल रहा हूँ?


क्या पूरी तरह से दूर के स्थान? केवल एम बिट्स हैं। वह शायद एक ही रजिस्टर में, या सबसे खराब एकल कैश लाइन में फिट बैठता है।

1
@ एल्डन एएआईकेआई यह 10 बिट्स / तत्व के आसपास कुछ का उपयोग करता है, नहीं? इसलिए, कई हजारों तत्वों के लिए - अर्थात, विशाल डेटास्टोर्स - यह निश्चित रूप से कैश में फिट नहीं होगा। इसलिए, यदि आप kहैश का उपयोग कर रहे हैं, तो आप संभवतः kप्रति रीड कैश मिस कर रहे हैं। दूसरी ओर हैश टेबल की गारंटी है कि आपके पास 0 उत्तर के साथ आपका जवाब होगा कि ज्यादातर समय - वैसे टकराव दुर्लभ हैं, वैसे भी।
MaiaVictor

आपके पास k बिट्स, अवधि है। सभी तत्व बिट्स की समान संख्या को प्रभावित करते हैं, इसीलिए झूठी सकारात्मक दर प्रविष्टियों की संख्या पर निर्भर करती है।

जवाबों:


33

आप याद कर रहे हैं कि दो डेटा संरचनाएँ हैश टकराव से कैसे निपटती हैं। ब्लूम फ़िल्टर वास्तविक मानों को संग्रहीत नहीं करता है, इसलिए आवश्यक स्थान नामित सरणी का स्थिर आकार है। इसके बजाय यदि आप एक पारंपरिक हैश का उपयोग करते हैं, तो यह आपके द्वारा दिए गए सभी मूल्यों को संग्रहीत करने की कोशिश करता है, इसलिए यह समय के साथ बढ़ता है।

एक सरलीकृत हैश फ़ंक्शन (केवल एक उदाहरण के लिए!) पर विचार करें 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यादृच्छिक सरणी पदों तक पहुंच प्राप्त करना। लेकिन यह आंकड़ा सटीक है। इसके बजाय हैश केवल आपको एक परिशोधित निरंतर पहुंच समय की गारंटी दे रहा है, लेकिन आपके हैश फ़ंक्शन और इनपुट डेटा की प्रकृति के आधार पर डी-जनरेट कर सकता है। इसलिए यह आम तौर पर तेजी से होता है, डे-जनरेट मामलों को छोड़कर।

हालाँकि, जब आपके पास हैश की टक्कर होती है, तो मानक हैश को क्वेरी मान के विरुद्ध संग्रहीत मानों की समानता की जाँच करनी होगी। यह समानता की जांच मनमाने ढंग से महंगी हो सकती है और कभी भी खिलने वाले फिल्टर के साथ नहीं होगी।

अंतरिक्ष के संदर्भ में, ब्लूम फ़िल्टर स्थिर है, क्योंकि निर्दिष्ट सरणी से अधिक मेमोरी का उपयोग करने की कोई आवश्यकता नहीं है। दूसरी ओर, हैश गतिशील रूप से बढ़ता है और टकराव के मूल्यों का ट्रैक रखने के कारण बहुत बड़ा हो सकता है।

ट्रेड-ऑफ: अब जब आप जानते हैं कि क्या सस्ता है और क्या नहीं और किन परिस्थितियों में आपको ट्रेड-ऑफ को देखने में सक्षम होना चाहिए। ब्लूम फ़िल्टर महान हैं यदि आप बहुत जल्दी पता लगाना चाहते हैं कि एक मूल्य पहले देखा गया है, लेकिन झूठी सकारात्मकता के साथ रह सकते हैं। दूसरी ओर, आप हैश मैप का चयन कर सकते हैं यदि आप अपने रनटाइम का न्याय करने में सक्षम नहीं होने की कीमत पर शुद्धता की गारंटी चाहते हैं, लेकिन कभी-कभी पतले मामलों को स्वीकार कर सकते हैं जो औसत से बहुत धीमा हो सकता है।

इसी तरह, यदि आप एक सीमित मेमोरी वातावरण पर हैं, तो आप उनकी मेमोरी उपयोग गारंटी के लिए ब्लूम फ़िल्टर को प्राथमिकता देना चाह सकते हैं।


बहुत बढ़िया जवाब। यह वही है जो मैं भ्रमित कर रहा था। वास्तव में प्रत्येक डेटा संरचना के अपने सबसे अच्छे उपयोग के मामले हैं और अलग-अलग विचार व्यापार-बंद पर निर्भर करता है।
रिचर्ड

यह वास्तव में एक उपयुक्त उदाहरण के साथ एक बहुत अच्छी व्याख्या है। तो हम 'k' मान के साथ कैसे चलते हैं? क्या यह हमारे पास मौजूद मूल्यों की कुल संख्या पर निर्भर करता है?
इसका वृहस्पति जूल 9'19

5

खिल फिल्टर और हैश के लिए उपयोग-मामले अलग हैं और ज्यादातर असंतुष्ट हैं, इसलिए प्रत्यक्ष तुलना का कोई मतलब नहीं है। इसके अलावा यह कार्यान्वयन के तकनीकी विवरणों पर निर्भर करेगा क्योंकि विभिन्न व्यापार-बंदों के साथ हैश टक्करों को संभालने के कई तरीके हैं।

ब्लूम फ़िल्टर जवाब दे सकता है कि क्या तत्व एक विशाल सेट के लिए उचित संभावना के साथ सेट में है, लेकिन स्मृति की मामूली मात्रा का उपयोग करके नहीं। विशाल, जैसे, खरबों तत्व। लेकिन वे कभी सटीक नहीं होते हैं। आप केवल अधिक मेमोरी या अधिक हैश फ़ंक्शन का उपयोग करके झूठी सकारात्मक की मात्रा कम कर सकते हैं।

दूसरी ओर हैश टेबल सटीक हैं, लेकिन उन्हें सेट स्टोर करने की आवश्यकता है। इसलिए खरबों तत्वों को स्मृति की टेराबाइट्स की आवश्यकता होगी (और यह केवल अमेरिकी खरबों है)। वे प्रत्येक तत्व के लिए अतिरिक्त डेटा भी संग्रहित कर सकते हैं, जो फ़िल्टर नहीं कर सकते।

जब किसी सदस्य के लिए डेटा प्राप्त करने की धीमी विधि होती है (जिसमें क्वेरी सर्वर, डिस्क से रीड और ऐसी) शामिल होती है, तो ब्लो फिल्टर का उपयोग किया जाता है (जो कि मेमोरी में फिट नहीं होगा या ग्राहक के लिए इसे स्थानांतरित करना अव्यावहारिक है) या ऐसे) और उन वस्तुओं के लिए धीमी गति से संचालन से बचना चाहते हैं जो सेट में नहीं हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.