फंक्शन जो इनपुट फैलाता है


14

मैं जानना चाहूंगा कि क्या n-बिट संख्या से n-बिट संख्या तक कोई फ़ंक्शन है जिसमें निम्नलिखित विशेषताएं हैं:f

  • f को विशेषण होना चाहिए
  • और दोनों की गणना बहुत तेजी से की जानी चाहिएff1
  • f को एक ऐसे नंबर को वापस करना चाहिए जिसका उसके इनपुट से कोई महत्वपूर्ण संबंध नहीं है।

तर्क यह है:

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

मेरा विचार प्रतीक संख्याओं को f के साथ जोड़ना है, fताकि वे पूरी तरह से [0,2 ^ {64} -1] की पूरी रेंज में फैले हों [0,2641]। चूंकि केवल इनपुट और आउटपुट के दौरान प्रतीक संख्याएं मायने रखती हैं जो केवल एक बार होता है, ऐसे फ़ंक्शन को लागू करना बहुत महंगा नहीं होना चाहिए।

मैंने Xorshift के यादृच्छिक संख्या जनरेटर के एक पुनरावृत्ति के बारे में सोचा, लेकिन मैं वास्तव में इसे पूर्ववत करने का तरीका नहीं जानता, हालांकि यह सैद्धांतिक रूप से संभव होना चाहिए।

क्या कोई इस तरह के समारोह को जानता है?
यह एक अच्छा विचार है?


1
मैं एक विशेषज्ञ नहीं हूं, लेकिन शायद आप एक छद्म आयामी क्रमचय का उपयोग कर सकते हैं (उदाहरण के लिए फिस्टल सिफर देखें )
Vor

यदि आप अनिवार्य रूप से हैश फ़ंक्शन की गणना कर रहे हैं, तो हैशिंग का उपयोग क्यों नहीं करें?
वॉनब्रांड

@vonbrand हैशिंग प्रतिवर्ती नहीं है। आवश्यकता संख्या २ देखें
२०:३१ पर फ़ूजएक्सल

इसे प्रतिवर्ती क्यों करना पड़ता है? लुकअप द्वारा इसे प्रतिवर्ती बनाने में क्या गलत है?
वॉनब्रांड

1
आप कुंजी के रूप में (f (x), x) स्टोर कर सकते हैं।
adrianN

जवाबों:


6

आप फाइबोनैचि हैशिंग का उपयोग कर सकते हैं , अर्थात्

hF(k)=k512k512

के लिए आपको मिल n जोड़ो में-अलग संख्या (लगभग) समान रूप से में फैल [ 0 , 1 ] । स्केलिंग से [ 1 .. M ] और गोलाई (नीचे) से, आपको उस अंतराल में समान रूप से फैले हुए नंबर मिलते हैं।k=1,,nn[0,1][1..M]

उदाहरण के लिए, ये हैं के अनुसार आकार [ 0..10000 ] (बाएं मूल अनुक्रम, सही क्रमबद्ध):hF(1),,hF(200)[0..10000]

यहाँ छवि विवरण दर्ज करें

यह एक उदाहरण है जिसे नूथ मल्टीफिशियल हैशिंग कहता है । के लिए कंप्यूटर के शब्द आकार, एक कुछ पूर्णांक अपेक्षाकृत करने के लिए प्रधानमंत्री डब्ल्यू और एम की जरूरत पतों की संख्या, हम का उपयोग करेंwAwM

h(k)=M((kAw)mod1)

हैशिंग फ़ंक्शन के रूप में। उपरोक्त (सुनिश्चित करें कि आप इसे पर्याप्त सटीकता के साथ गणना कर सकते हैं)। हालांकि यह अलावा किसी अन्य अपरिमेय संख्या के साथ भी काम करता है , यह केवल दो संख्याओं में से एक है जो "सबसे समान रूप से वितरित" संख्या की ओर ले जाता है।A/w=ϕ1=512ϕ1

में अधिक जानकारी प्राप्त करें आर्ट ऑफ़ कंप्यूटर प्रोग्रामिंग , खंड 3 डोनाल्ड नुथ (द्वितीय संस्करण में पेज 513 से अध्याय 6.4) द्वारा। विशेष रूप से आपको पता चलेगा कि परिणामी संख्याएँ जोड़ी के हिसाब से अलग क्यों हैं (कम से कम अगर ) तो और व्युत्क्रम फलन की गणना कैसे करें यदि आप बजाय प्राकृतिक और उपयोग करते हैं ।nMAwϕ1


1
कुशलता से गणना कैसे करें ? f1
frafl

1
@frafl मुझे उम्मीद है कि मेरे संपादन कुछ हद तक आपकी चिंता को संबोधित करेंगे। हालांकि, यह स्पष्ट है कि ये हैशिंग तकनीक न तो विशेष रूप से कुशलता से उलटने के लिए डिज़ाइन की गई है।
राफेल

हाँ, यह करता है, मैं इसे बढ़ा दूंगा, हालांकि मैं इसे स्वीकार किए गए उत्तर के रूप में अनुशंसित नहीं करूंगा।
frafl

1

के लिए -बिट आदानों, इस समारोह काम करता है:k

hash(n)=(nmod2k2)2k2+ndiv2k2

hash(hash(n))=n{n,m},n<mhash(m)<hash(n){1,,2k21}

Ref: प्रतिवर्ती हैश फ़ंक्शन


यह सरल और अच्छा लग रहा है। मैं उस एक का परीक्षण करने जा रहा हूं।
फ़ूजएक्सल

1
1. इनपुट के आधार पर, यह भारी सहसंबंध ( स्पीयरमैन के ρ के लिए तक) उत्पन्न कर सकता है । 2. यह 32 बिट्स के लिए है, 64 बिट्स के लिए नहीं। 3. क्या आप इसे भाषा-स्वतंत्र तरीके से लिख सकते हैं? 1ρ
फ्राफेल

यह बहुत स्पष्ट है! 64-बिट (0x00000000FFFFFFFF) के लिए और आपको 32 बिट्स को शिफ्ट (<<) करना चाहिए। यह कार्य सरल, व्यावहारिक और अभ्यास में काफी तेज है।
रेजा

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