मैं C # में एक तेज़, अच्छी तरह से वितरित हैश तालिका को लागू करना चाहता हूं। मुझे अपने हैश-कांस्टिंग कार्य को चुनने में परेशानी हो रही है जो एक मनमाना हैश कोड और "बाधा" लेता है, इसलिए इसका उपयोग बाल्टियों को अनुक्रमित करने के लिए किया जा सकता है। मेरे सामने अब तक दो विकल्प हैं:
एक तरफ, आप यह सुनिश्चित कर सकते हैं कि आपकी बाल्टियों में हमेशा तत्वों की एक प्रमुख संख्या होती है, और हैश के लिए आपको बस बाल्टियों की संख्या से इसे व्यवस्थित करना है। यह वास्तव में, .NET का शब्दकोश क्या करता है । इस दृष्टिकोण के साथ समस्या यह है कि% का उपयोग करना अन्य कार्यों की तुलना में बेहद धीमा है; अगर आप एग्नर फॉग इंस्ट्रक्शन टेबल को देखते हैं ,
idiv
(जो असेंबली कोड जो% के लिए उत्पन्न होता है) नए इंटेल प्रोसेसर के लिए एक निर्देश विलंबता ~ 25 चक्र है।mul
बिटवाइज़ ऑप्स जैसेand
, या, के लिए इसकी तुलना लगभग 3 या 1or
से करेंxor
।दूसरी ओर, आपके पास बाल्टियों की संख्या हमेशा 2 की शक्ति हो सकती है। आपको फिर भी हैश के मापांक की गणना करनी होगी ताकि आप सरणी के बाहर इंडेक्स करने का प्रयास न करें, लेकिन इस बार यह कम खर्चीला होगा । चूँकि 2 की शक्तियाँ
% N
बस हैं& (N - 1)
, अड़चन को एक मास्किंग ऑपरेशन में घटा दिया जाता है, जिसमें केवल 1-2 चक्र होते हैं। यह Google के स्पार्शश द्वारा किया जाता है । इसका नकारात्मक पक्ष यह है कि हम उपयोगकर्ताओं को अच्छी हैश प्रदान करने के लिए गिनती कर रहे हैं; हैश अनिवार्य रूप से हैश के हिस्से को काट देता है, इसलिए हम अब हैश के सभी बिट्स को ध्यान में नहीं रखते हैं। यदि उपयोगकर्ता के हैश को असमान रूप से वितरित किया जाता है, उदाहरण के लिए केवल उच्च बिट्स भरे जाते हैं या निचले बिट्स लगातार समान होते हैं, तो इस दृष्टिकोण में टकराव की दर अधिक होती है।
मैं एक एल्गोरिथ्म की तलाश कर रहा हूं जिसका उपयोग मैं कर सकता हूं जिसमें दोनों दुनिया का सबसे अच्छा है: यह हैश के सभी बिट्स को ध्यान में रखता है, और% का उपयोग करने से भी तेज है। यह जरूरी नहीं कि एक मापांक होना चाहिए, बस कुछ है जो सीमा में होने की गारंटी है 0..N-1
(जहां एन बाल्टियों की लंबाई है) और सभी स्लॉट के लिए वितरण भी है। क्या ऐसा एल्गोरिथ्म मौजूद है?
मदद के लिए धन्यवाद।