क्या पूर्णांक के संग्रह (यानी, बहु-सेट) के लिए एक हैश फ़ंक्शन है, जिसकी सैद्धांतिक गारंटी है?


36

मैं उत्सुक हूं कि पूर्णांकों के बहु-सेट के हैश को स्टोर करने का एक तरीका है जिसमें निम्नलिखित गुण हैं, आदर्श रूप से:

  1. यह O (1) स्पेस का उपयोग करता है
  2. इसे ओ (1) समय में सम्मिलन या विलोपन को प्रतिबिंबित करने के लिए अपडेट किया जा सकता है
  3. दो समान संग्रह (यानी, समान गुणकों वाले समान तत्व) को हमेशा समान मान के साथ हैश करना चाहिए, और दो अलग-अलग संग्रह उच्च संभावना वाले विभिन्न मानों के लिए हैश होना चाहिए (यानी, फ़ंक्शन स्वतंत्र या जोड़दार स्वतंत्र है)

इस पर एक प्रारंभिक प्रयास उत्पाद modulo व्यक्तिगत तत्वों की हैश की एक यादृच्छिक प्रधानमंत्री की दुकान होगी। यह 1 और 2 को संतुष्ट करता है, लेकिन यह स्पष्ट नहीं है कि यह या एक निकट भिन्नता, 3 को संतुष्ट करेगा।

मैंने मूल रूप से इसे StackOverflow पर पोस्ट किया है ।

* गुण 1 और 2 को थोड़ा आराम करने के लिए कहा जा सकता है, कहते हैं, ओ (लॉग एन), या एक छोटा सा बहुपद बहुपद। देखने वाली बात यह है कि क्या हम स्वयं तत्वों को संग्रहीत किए बिना बहु-सेटों की पहचान कर सकते हैं और मज़बूती से समानता का परीक्षण कर सकते हैं।


मल्टीसेट्स का आपका प्रतिनिधित्व क्या है? यानी, आप एक बिट स्ट्रिंग के रूप में एक मल्टीसेट को कैसे एनकोड करेंगे? यदि आप वास्तव में समय संचालन (मल्टीसेट के स्वतंत्र रूप से प्राप्त करना चाहते हैं , तो मुझे लगता है कि आपको एन्कोडिंग को स्पष्ट करना चाहिए। O(1)
जुक्का सुओमेला

सेट की एन्कोडिंग महत्वहीन है। हैश फ़ंक्शन सेटों के प्रतिनिधित्व से स्वतंत्र होना चाहिए। अगर मैं एक हैश सेट के कैनोनिकल प्रतिनिधित्व का उपयोग कर रहा था, तो सेट के बिट प्रतिनिधित्व पर कोई भी मानक हैश 3 और शायद 1 को संतुष्ट करेगा, लेकिन मुझे 2. यह नहीं जोड़ना चाहिए कि दो समान संग्रह हमेशा समान मूल्य पर हैश होना चाहिए।
जोंडररी

2 का वास्तव में क्या मतलब है? क्या आपको पुराने सेट, पुराने हैश कोड और नए तत्व मिलते हैं, और आप नए हैश कोड की गणना करना चाहते हैं? या क्या आपको सिर्फ पुराने हैश कोड और नए तत्व मिलते हैं?
मिहाई

आदर्श रूप में, आपको पुराने सेट की आवश्यकता नहीं होगी। आपको सदस्य प्रश्नों (महत्वपूर्ण, स्थान की सीमाओं को देखते हुए), बस समानता परीक्षण करने में सक्षम होने की आवश्यकता नहीं है, संभवतः हैश मानों की तुलना के माध्यम से जिनकी झूठी सकारात्मकता की संभावना कम है।
जॉन्ड्री

जवाबों:


17

यदि आप ब्रह्मांड में रहने वाले सेट के बारे में सोचते हैं , तो अपडेट समय के साथ अपनी समस्या को हल करना काफी आसान है । आप सभी की जरूरत है तेजी से "स्थानीय अद्यतन" के साथ, संख्या के एक वेक्टर के लिए एक फास्ट हैश फ़ंक्शन है ।( एलजी यू ) यू[u]O(lgu)u

विकिपीडिया / यूनिवर्सल हैशिंग का सुझाव , जहाँ एक बड़ा प्राइम है और से समान रूप से तैयार किया गया है । जब आप तत्व जोड़ते या हटाते हैं , तो आपको हैश कोड से को जोड़ना / घटाना होता , जिसमें विखंडन का उपयोग करते हुए विभाजन और जीत के लिए समय लगता है। चूंकि डिग्री एक बहुपद में केवल जड़ हो सकते हैं, दो अलग-अलग सेटों के लिए टकराव की संभावना । यह को काफी बड़ा होने के लिए बहुत छोटा बनाया जा सकता है (उदाहरण के लिए, यू हे ( यू / पी ) पी पी = यू 2 [ यू ]h(x)=(i=1uxiai)modpएक [ पी ] मैं एक मैं हे ( एलजी मैं ) यूpa[p]iaiO(lgi)uuO(u/p)pp=u2और आप "दोहरी सटीकता" में काम करते हैं)। यदि सेट तुलना में बहुत छोटा है , तो आप निश्चित रूप से ब्रह्मांड को एक छोटे ब्रह्मांड से शुरू कर सकते हैं।[u]

किसी को टक्कर संभावना के साथ एक समाधान पता है जब हैशिंग तक हैशिंग ? यह संभव होना चाहिए।[ p ]O(1/p)[p]


0

कार्टर और वेगमैन ने इसे नए हैश कार्यों और प्रमाणीकरण में उनके उपयोग को कवर किया और समानता स्थापित की ; यह आपके वर्णन के समान है। अनिवार्य रूप से एक commutative हैश फ़ंक्शन O और (1) में सम्मिलन और विलोपन और उच्च संभावना मैचों के लिए एक समय में एक तत्व को अपडेट किया जा सकता है।


मुझे लगता है कि यह केवल सेट पर काम करता है, न कि मल्टीसेट्स (जैसा सवाल पूछा गया है)। धारा 5 से, पृष्ठ 274 के निचले भाग में: "ADD (x, S) -S को x के सेट में तत्व x जोड़ता है। यदि x पहले से ही S का सदस्य है, तो इस ऑपरेशन का उपयोग नहीं किया जा सकता है।"
जबपल

आप सही हे; मुझे "मल्टी" भाग याद आ गया। ऐसा लगता है कि एक हैश फ़ंक्शन डुप्लिकेट को संभाल सकता है, हालांकि मेरे पास इसके लिए कोई उद्धरण नहीं है।
किलविट्स

-2

एक हैश फ़ंक्शन की गुणवत्ता हमेशा उन तत्वों के गुणों पर निर्भर करेगी जो इसे हैश करना है। क्या आप इस बारे में कुछ कह सकते हैं? उदाहरण के लिए, यदि आपके मल्टीसेट के तत्वों में आमतौर पर कई छोटे प्राइम कारक हैं, तो आपका उत्पाद सुझाव संभवतः एक खराब हैश फ़ंक्शन है। लेकिन आप इस मामले में इसे कुछ primes p और q के लिए सभी x_i + p mod q के गुणनफल से ले सकते हैं।


1
हां, यही कारण है कि व्यक्तिगत तत्वों की हैश को एक साथ गुणा करने से पहले लेना चाहिए।
जोंडररी

क्या? ओपी का सुझाव बस उन सभी को एक साथ गुणा करना है, है ना? मैं कह रहा हूं कि यदि आप ऐसा करने से पहले प्रत्येक में एक निरंतरता जोड़ते हैं, तो आप शायद एक बेहतर हैश प्राप्त करते हैं।
टोनीके डेक्

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

योग हमें एक ही मान
के कई बार होने की अनुमति देता है xor हमें उस राशि को सेट करने की अनुमति देता है

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