2012-10-22 31 views
10

से एक अनूठा हैश बनाएं, क्या कोई भी दो तारों में से एक अद्वितीय हैश बनाने का तरीका सोच सकता है? कुछ ऐसा है जो यह सुनिश्चित करता है:दो स्ट्रिंग्स

hash(string1,string2) = hash(string2,string1).

मैं हमेशा अपने नक्शे में दो अलग-अलग मान के तहत एक ही संदर्भ स्टोर कर सकते हैं, लेकिन मैंने सोचा था कि: वहाँ एक बेहतर तरीका होना चाहिए ...

+0

उनकी तुलना करें, और छोटी स्ट्रिंग के रूप में छोटे का उपयोग करें, दूसरी स्ट्रिंग के रूप में बड़ा। शायद आपको समझाया जाना चाहिए, आप ऐसा व्यवहार क्यों चाहते हैं। – martinstoeckli

+3

हैश कोड अद्वितीय नहीं हैं। – Jesper

उत्तर

17

एक और तरीका हैश दोनों स्ट्रिंग्स और परिणामों को एक्सर करना है। चूंकि xor कम्यूटिव है, ऑर्डर कोई फर्क नहीं पड़ता। यदि हैश बराबर हैं, तो समान तारों के अन्य जोड़े के साथ टकराव से बचने के लिए उन्हें ज़ोर न करें।

+0

मेरे लिए सही लगता है, मैं जिस स्ट्रिंग के साथ काम कर रहा हूं वह अनूठा है। – Peter

+0

यदि इसकी गारंटी है, तो आपको यह भी जांचने की आवश्यकता नहीं है कि हैश समान हैं या नहीं। –

+1

हालांकि ऑर्डरिंग भी काम करेगी, यह सैद्धांतिक सीएस परिप्रेक्ष्य से अधिक सुंदर है;) – Joost

6

जांच करें, कहीं वे 'वर्णानुक्रम में फिर से करें और उन्हें स्वैप करें यदि वे उन्हें संयोजित करने से पहले नहीं हैं और नतीजे हैं।

+0

आप मुझसे 41secs तेज थे :( –

7

ठीक है आप उन्हें पहले से ही तारों को "ऑर्डर" करने का प्रयास कर सकते हैं, ताकि तारों की किसी भी जोड़ी को हमेशा उसी क्रम में संसाधित किया जा सके।

9

क्या आप तेजी से होना चाहते हैं, या आप अच्छे बनना चाहते हैं? व्यक्तिगत हैश कोड पर कोई भी सममित ऑपरेशन जो आप चाहते हैं उसका उत्पादन करेगा; +, *, और ^ सभी सभ्य विकल्प हैं; ^ 0 उत्पन्न करता है यदि दोनों समान हैं, तो आपको इसे पकड़ने के लिए आमतौर पर if की आवश्यकता होती है; + अधिक * से टकराव उत्पन्न होने की संभावना है लेकिन दोनों इतना महान यह देखते हुए कि String पर आंतरिक hashCode विधि बहुत घटिया है नहीं कर रहे हैं:

scala> "BB".hashCode == "Aa".hashCode // Seriously?! 
res40: Boolean = true 

आप अपने तार इतना टकराने नहीं करने के लिए, तार पर scala.util.MurmurHash.stringHash उपयोग करना चाहते हैं (2.9; scala.util.hashing.MurmurHash.stringHash 2.10 में), और फिर उपर्युक्त तरीकों में से एक।

+0

मुझे पहली पंक्ति नहीं समझा, क्या आपका मतलब है कि हैश (ए) + हैश (बी) 'ओपी क्या चाहता है? (यानी। हैश (ए) + हैश (बी) == हैश (बी) + हैश (ए) ' – laggingreflex

+0

@ लैगिंगफ्लेक्स - यह सही है। –

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