2012-02-16 27 views
5

मेरे पास एक जावा प्रशंसा है जिसमें मैं स्ट्रिंग के लिए long आईडी उत्पन्न करना चाहता हूं (neo4j में उन तारों को स्टोर करने के लिए)। डेटा डुप्लिकेशन से बचने के लिए, मैं long पूर्णांक में संग्रहीत प्रत्येक स्ट्रिंग के लिए एक आईडी उत्पन्न करना चाहता हूं, जो प्रत्येक स्ट्रिंग के लिए अद्वितीय होना चाहिए। मैं उसे कैसे कर सकता हूँ ?मैं स्ट्रिंग का लंबा हैश कैसे उत्पन्न कर सकता हूं?

+0

क्या आप स्ट्रिंग्स का हैश नहीं प्राप्त कर सकते थे और उन्हें नियो में स्टोर करने से पहले लंबे समय तक कास्ट कर सकते थे? – Marthin

+5

आप "सभी तारों के लिए अद्वितीय" प्राप्त नहीं कर सकते हैं - लंबे समय तक 64 बिट्स हैं, लंबाई 9 की एक स्ट्रिंग में 72 बिट्स हैं, कुछ स्ट्रिंग्स होने चाहिए जो एक ही लंबे – amit

+1

पर धोए जाएंगे, क्योंकि आप विशिष्टता प्राप्त नहीं कर सकते हैं, क्योंकि वहां हैं अनगिनत कई तार और केवल अंतहीन कई लंबे समय तक। क्या आप अधिक विशेष रूप से वर्णन कर सकते हैं कि आप क्या खोज रहे हैं? – templatetypedef

उत्तर

4

long में 64 बिट्स हैं। लंबाई 9 के String में 72 बिट्स हैं। pigeon hole principle से - आपको 9 वर्णों के लंबे तारों के लिए long पर अनूठा हैशिंग नहीं मिल सकता है।

आप अभी भी एक long हैश चाहते हैं: तुम बस String->int, hash1() और hash2() के लिए दो मानक [! विभिन्न] हैश फंक्शन लेने के लिए और गणना कर सकते हैं: बहुत अच्छी हैश hash(s) = 2^32* hash1(s) + hash2(s)

6

क्यों आप स्ट्रिंग के hashcode() फ़ंक्शन को नहीं देखते हैं, और इसके बजाय लंबे मानों का उपयोग करने के लिए इसे अपनाने के लिए?

बीटीडब्ल्यू। यदि प्रत्येक स्ट्रिंग के लिए एक अद्वितीय आईडी बनाने का कोई तरीका था, तो आपको एक संपीड़न एल्गोरिदम मिलेगा जो प्रत्येक स्ट्रिंग को 8 बाइट्स (परिभाषा से संभव नहीं) में पैक करने में सक्षम होगा।

1

कई जवाब नहीं है, कोशिश निम्नलिखित:

  • http://stackoverflow.com/questions/415953/generate-md5-hash-in-java संपादित करें: हटा, मैं नहीं छूटा है long आवश्यकता। मी culpa।
  • http://en.wikipedia.org/wiki/Perfect_hash_function

या, जैसा कि पहले का सुझाव दिया, सूत्रों का कहना है की जाँच करें।

पीएस। स्ट्रिंग्स के शब्दकोश को बनाए रखने के लिए एक और तकनीक है: चूंकि आपको 2 स्ट्रिंग्स जल्द ही प्राप्त करने की संभावना नहीं है, तो आप सही मैपिंग कर सकते हैं। ध्यान दें कि मैपिंग भी एक बड़ी बाधा बन सकती है।

5

इस कोड की गणना करेगा:

String s = "some string"; 
long hash = UUID.nameUUIDFromBytes(s.getBytes()).getMostSignificantBits(); 
संबंधित मुद्दे