UUID

2013-03-03 7 views
15

का उपयोग करके अनन्य लंबे समय तक उत्पन्न करने के लिए मुझे अपने डेटाबेस प्राथमिक कुंजी कॉलम के लिए अद्वितीय लंबे आईडी उत्पन्न करने की आवश्यकता है।UUID

मैंने सोचा था कि मैं UUID.randomUUID() का उपयोग कर सकते हैं। GetMostSignificantBits() लेकिन कभी कभी अपने पैदा करने में कुछ नकारात्मक लंबे भी जो मेरे लिए समस्या है।

क्या यूयूआईडी से केवल सकारात्मक लंबा उत्पन्न करना संभव है? अरबों प्रविष्टियों की तरह होगा इसलिए मैं चाहता हूं कि प्रत्येक जेनरेट की गई कुंजी अद्वितीय हो।

+0

आप अनुक्रम का उपयोग क्यों नहीं करते हैं? क्या आप इस तरह की चीजों का उपयोग करने में सक्षम हैं? या यूयूआईडी यह एक समाधान है जिसका उपयोग आप करना चाहते हैं? –

+0

क्या आप अनुक्रम –

+0

के बारे में अधिक समझा सकते हैं आप किस डीबी का उपयोग करते हैं? आप किस डीबी ढांचे का उपयोग करते हैं (जेडीबीसी, हाइबरनेट, मायबेटिस)? – Taky

उत्तर

4

http://commons.apache.org/sandbox/commons-id//index.html पर एक नज़र डालें, इसमें एक लॉन्ग जेनरेटर है जो आपको वही चीज़ दे सकता है जो आपको चाहिए।

इसके अलावा अगर आप हाइबरनेट उपयोग कर रहे हैं तो आप यह पूछ आप के लिए आईडी (यह कई एल्गोरिदम से आप चुन सकते है) उत्पन्न करने के लिए कर सकते हैं, में नहीं तो तुम सिर्फ उदाहरण http://grepcode.com/file/repo1.maven.org/maven2/hibernate/hibernate/2.1.8/net/sf/hibernate/id/TableHiLoGenerator.java#TableHiLoGenerator के लिए उनके कार्यान्वयन पर एक नज़र ले जा सकते हैं)

+0

अच्छा यह भी अच्छा लग रहा है। –

+0

LongGenerator एक अनुक्रमिक आईडी बनाएगा जिसका अर्थ है कि यह टकरा सकता है। जबकि GUID सार्वभौमिक अद्वितीय है। यह सौरभ की आवश्यकता के लिए पर्याप्त हो सकता है लेकिन मुझे लगता है कि यह बिल्कुल सही जवाब नहीं है – Sap

+0

अपाचे कॉमन्स-आईडी डाउनलोड के लिए उपलब्ध नहीं है? कोई अन्य विकल्प? – user12458

1

मैं अभी इस समाधान में आया हूं। मैं उस समय समाधान को समझने की कोशिश कर रहा हूं। यह ट्विटर हिमपात का जावा कार्यान्वयन कहता है। ट्विटर स्नोफ्लेक आईडी पीढ़ी एल्गोरिदम पर आधारित 64 बिट अनुक्रमिक आईडी जेनरेटर।

https://github.com/Predictor/javasnowflake

कोई सुझाव का स्वागत है।

+0

लेकिन फिर मैं सार्वजनिक सिंक्रनाइज़ स्ट्रिंग जेनरलोड() को देखता हूं। सिंक्रनाइज़ ब्लॉक लंबे समय तक प्रदर्शन को कम करेगा, –

+1

सिंक्रनाइज़ेशन के कारण किसी भी प्रदर्शन में गिरावट में लंबी दौड़ या शॉर्ट रन कैसे अंतर करता है? – user93353

+2

@ सौरभ कुमार मुझे बहुत संदेह है कि आप छोटे सिंक्रनाइज़ किए गए ब्लॉक के साथ प्रदर्शन समस्याओं में भाग लेंगे। सिंक्रनाइज़ होने पर आमतौर पर धीमी गति से सीएएस की तुलना में धीमी नहीं होती है (यानी जावा के एनआईओ भी Google पर इस पर एक बड़ी बात थी) और यह किसी भी डेटाबेस सीरियल आईडी जेनरेटर से निश्चित रूप से तेज़ है (मान लीजिए कि आपको पहले आईडी की आवश्यकता है, डेटाबेस राउंडट्रिप ... आदि)। आपको पता होना चाहिए कि जावा में सिंक्रनाइज़ की गई अन्य चीजों की एक बड़ी मात्रा भी है (अधिकांश सर्वलेट कंटेनर इसे कहीं करते हैं)। –

3

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

(System.currentTimeMillis() << 20) | (System.nanoTime() & ~9223372036854251520L); 

नैनो & ~ 9223372036854251520L हिस्सा वर्तमान नैनोसेकंड लेता है और पहले 44 बाइट्स सेट

nanoseconds & ~1111111111111111111111111111111111111111111100000000000000000000 

साइड नोट:: 0 करने के लिए, केवल सही 20 बिट जो एक मिलीसेकंड (999999 nanos) अप करने के लिए नैनोसेकंड प्रतिनिधित्व छोड़ने यह रूप में ही है नैनोसेकंड वर्तमान प्रतिनिधित्व करने के लिए नहीं किया जाना चाहिए समय क्योंकि उनका प्रारंभिक बिंदु समय पर तय नहीं होता है और जब वे अधिकतम तक पहुंचते हैं तो उन्हें पुनर्नवीनीकरण किया जाता है।

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

12
UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE 
+1

मुझे यह पसंद है क्योंकि यह कोई तृतीय-पक्ष पुस्तकालयों का उपयोग नहीं करता है :) – DoctorD

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