2014-08-27 5 views
5

मैं unicode codepoint names to their codepoint number (दूसरे कॉलम को दूसरे कॉलम में मैपिंग) से मैपिंग को संपीड़ित करने के लिए एक (सही) हैश तालिका लिखने की कोशिश कर रहा हूं। जैसा कि आप वहां देख सकते हैं, संभावित इनपुट बहुत प्रतिबंधित हैं, वास्तव में वर्णमाला में बिल्कुल 38 वर्ण हैं: AB...YZ, 0...9, - और स्थान। इसके अलावा, वहाँ की (-स्ट्रिंग) पुनरावृत्ति, DIGIT ZERO, DIGIT ONE, ..., LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER B आदि एक बहुत हैकम-एन्ट्रॉपी अल्फान्यूमेरिक तारों के लिए कुशल हैश फ़ंक्शन

सही हैश तालिका एक बीज S चुनने, और फिर एक आदर्श हैश तालिका का निर्माण करने की कोशिश कर रहा द्वारा गणना की जाती है बीजिंग (किसी भी तरह से) हैशर S द्वारा। यदि कोई टेबल नहीं बनाया जा सकता है, तो यह एक नए बीज के साथ पुनः प्रयास करता है। बहुत से टकराव होने के लिए आम तौर पर अधिक रिट्रीज़ की आवश्यकता होती है क्योंकि एल्गोरिदम के लिए सबकुछ फिट करना कठिन होता है।

इसका अपरशॉट मेरा इनपुट डोमेन कम एन्ट्रॉपी है, और टेबल निर्माण के लिए डीजेबी 2 जैसे सरल हैश कार्यों के साथ बहुत सारी रिट्रीज़ की आवश्यकता होती है; एफएनवी जैसे बेहतर हैशर सहिष्णु रूप से अच्छी तरह से काम करते हैं, लेकिन सिफहाश जैसे अधिक जटिल और धीमे कार्यों को औसतन कम रिट्रीज़ की आवश्यकता होती है।

इस के बाद से पूरी तरह से स्थिर और precomputed है, मैं गुणवत्ता की खातिर (यानी सुरक्षा और रनटाइम पर मनमाने ढंग से इनपुट कोई फर्क नहीं पड़ता के लिए संभाव्य वितरण) के लिए गुणवत्ता के बारे में भी चिंतित नहीं हूँ, लेकिन उच्च गुणवत्ता कार्यों precomputation समय की आवश्यकता को कम संपीड़न के दिए गए स्तर के लिए, इसके विपरीत, मुझे कुछ निश्चित समय में उच्च संपीड़न प्राप्त करने की अनुमति दें।

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

मैंने 'अल्फान्यूमेरिक हैश फ़ंक्शन' जैसी चीजों की खोज की है, लेकिन परिणाम असंबद्ध हैं (अधिकांशतः केवल हैश फ़ंक्शन के आउटपुट के रूप में अल्फान्यूमेरिक स्ट्रिंग उत्पन्न करना); सही शब्दकोष के बारे में भी कुछ मार्गदर्शन ताकि मैं कागजात की खोज कर सकूं।

(यह सवाल थोड़ा, हल करने के लिए दिलचस्प वास्तव में आवश्यक नहीं किया जा रहा से प्रेरित है।)

+0

आप 27268 वस्तुओं के लिए एक आदर्श हैश चाहते हैं? मुझे मुश्किल लगता है। क्यों न केवल * मानक * हैशफंक्शन का उपयोग करें और टकराव को संभालें? (और शायद कम भरने वाले कारक का उपयोग करें) – wildplasser

+0

@ विल्डप्लेसर यह ठीक काम करता है, इसे उत्पन्न करने में थोड़ा समय लग सकता है। जैसे [यह सरणी] (https://github.com/huonw/unicode_names/blob/1f331f78201b914604346e1d6fc3e9b3b2eda772/src/generated_phf।आरएस # एल 771) हैशटेबल ही है: उस तालिका में इंडेक्स के रूप में इनपुट स्ट्रिंग के हैश का उपयोग करें (और फिर यह सही है सत्यापित करें)। इस सवाल का मुद्दा जितना संभव हो उतना कम काम करके इनपुट की संरचना का तेजी से उपयोग कर रहा है। इसके अलावा, यह संपीड़न के लिए है, इसलिए एक कम लोड कारक अच्छा नहीं है। – huon

+0

@wildplasser अन्त में, कि मैं वर्तमान में एक मानक हैश समारोह (मैं वास्तव में सवाल में तीन उल्लेख) का उपयोग कर रहा ध्यान दें। – huon

उत्तर

0

मैं एक (सही) हैश तालिका लिखने के लिए कोशिश कर रहा हूँ ...

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

वैकल्पिक रूप से आप एक गैर-हैश आधारित दृष्टिकोण का उपयोग उदाहरण के लिए डीएडब्ल्यूजी या कुछ ट्री-जैसी संरचना (और शीर्ष पर कुछ अहो-कोरसिक) के साथ कर सकते हैं।

एक डीएडब्ल्यूजी संख्याओं के तारों के लिए काफी कॉम्पैक्ट स्टोरेज और तेज़ खोज देगा। मेरा झुकाव यह है कि यह आपकी समस्या के लिए हैश टेबल को हरा देगा।

कुछ परिचय के लिए http://www.wutka.com/dawg.html देखें। कई भाषाओं में कार्यान्वयन हैं।

संबंधित मुद्दे