तो ब्लूम फ़िल्टर के बारे में मजेदार बात यह है कि प्रभावी ढंग से काम करने के लिए उन्हें कई हैश फ़ंक्शंस की आवश्यकता होती है।
जावा स्ट्रिंग्स में पहले से ही एक हैश फ़ंक्शन बनाया गया है जिसमें आप 32-बिट पूर्णांक हैश के साथ String.hashCode() का उपयोग कर सकते हैं। यह अधिकांश उद्देश्यों के लिए एक ठीक हैशकोड है, और यह संभव है कि यह पर्याप्त है: उदाहरण के लिए यदि आप इसे 2 अलग 16-बिट हैशकोड में विभाजित करते हैं तो यह आपके ब्लूम फ़िल्टर को काम करने के लिए पर्याप्त हो सकता है। आपको शायद कुछ टकराव मिलेगा लेकिन यह ठीक है - ब्लूम फिल्टर से कुछ टकराव होने की उम्मीद है।
यदि नहीं, तो आप शायद अपना खुद का रोल करना चाहेंगे, इस मामले में मैं कच्चे चार डेटा तक पहुंचने के लिए String.getChars() का उपयोग करने की सलाह दूंगा, फिर एकाधिक हैशकोड की गणना करने के लिए इसका उपयोग करें।
Clojure कोड आप आरंभ करने के लिए (सिर्फ चरित्र मूल्य जोड़कर):
(let [s "Hello"
n (count s)
cs (char-array n)]
(.getChars s 0 n cs 0)
(areduce cs i v 0 (+ v (int (aget cs i)))))
=> 500
नोट Clojure के जावा के उपयोग इंटरॉप getChars कॉल करने के लिए, और areduce के उपयोग आप एक बहुत तेजी से यात्रा से अधिक देने के लिए चरित्र सरणी
आप इस जावा ब्लूम फ़िल्टर कार्यान्वयन में रुचि भी ले सकते हैं जो मैंने गिथब पर पाया: https://github.com/MagnusS/Java-BloomFilter। हैशकोड कार्यान्वयन पहली नज़र में ठीक दिखता है लेकिन यह एक बाइट सरणी का उपयोग करता है जो मुझे लगता है कि चरित्र एन्कोडिंग ओवरहेड से निपटने की आवश्यकता के कारण वर्णों का उपयोग करने से थोड़ा कम कुशल है।
डेटा किस प्रकार अपनी चाबी कर रहे हैं? तार? बाइट सरणी? पूर्णांकों? UUIDs? – pmdj
मैं स्ट्रिंग्स – jdoig
के सेट के खिलाफ सदस्यता के लिए परीक्षण कर रहा हूं आप स्ट्रिंग पर 'हैश()' विधि द्वारा रिपोर्ट किए गए अंतर्निहित हैश मान में एक मिश्रण हैश फ़ंक्शन को बार-बार लागू करने का प्रयास कर सकते हैं, उदा। http://www.cris.com/~Ttwang/tech/inthash.htm जेनरेट किए गए मान बहुत दृढ़ता से सहसंबंधित हो सकते हैं, जो ब्लूम फ़िल्टर को अप्रभावी बना सकता है। एक दृष्टिकोण जिसे मैंने अतीत में उपयोग किया है, हैश फ़ंक्शन का उपयोग बहुत लंबे परिणाम के साथ करना है, जैसे कि SHA-256, और परिणाम को खंड में विभाजित करें। यह आपके उद्देश्यों के लिए बहुत धीमा हो सकता है। सबसे आसान हो सकता है कि 'स्ट्रिंग हैश फ़ंक्शन' के लिए Google खोज करें और इसके कुछ परिणाम लागू करें। – pmdj