Java में GUID बनाएं


377

जावा में GUID बनाने के कुछ सबसे अच्छे तरीके क्या हैं?


3
Stackoverflow.com/questions/325443/generate-uuid-in-java पर सवाल GUID टक्करों के बारे में अधिक है, तो बस जावा तकनीक स्टैक में एक GUID के बराबर क्या है, जो कि (मुझे लगता है) अधिक है इस सवाल का ध्यान केंद्रित।
जॉन एडम्स

जवाबों:


346

जावा 5 और बाद में बंडल किए गए यूयूआईडी वर्ग पर एक नजर डालें ।

उदाहरण के लिए:


7
यदि आप एक उदाहरण शामिल करते हैं जैसे कालेब ब्रेज़े ने किया, तो आपका अच्छा जवाब और भी बेहतर होगा।
जीरो 3

AndroidStudio 2.3 और API स्तरों पर 21 और उससे कम पर काम करता है। शायद आगे पीछे भी।
राडदेवस

5
TL, DR ... "UUID uuid = UUID.randomUUID ();"
अविराम फायरबर्गर

419

java.util.UUID.randomUUID();


2
क्या यह दोबारा लौट सकता है? क्योंकि गाइड कभी दोहराने नहीं जा रहे हैं
स्वर्गदूत

3
@ इंजील हाँ, यह सैद्धांतिक रूप UUID.randomUUIDसे एक डुप्लिकेट को वापस करने के लिए संभव है , लेकिन यह बिल्कुल भी यथार्थवादी चिंता नहीं है । Oracle / OpenJDK कार्यान्वयन एक क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक संख्या जनरेटर का उपयोग करता है। यह देखते हुए, और एक यूयूआईडी में इतने सारे बिट्स द्वारा दी गई खगोलीय सीमा को देखते हुए , आप अपने ऐप में ऐसे कई लाखों मूल्य उत्पन्न कर सकते हैं और फिर भी अच्छी तरह से सो सकते हैं। अन्य वेरिएंट में से एक का उपयोग "अंतरिक्ष और समय", [1] मैक पते या नाम, और [2] वर्तमान तिथि-समय, बाधाओं के रूप में उपयोग करने के कारण टकराव की संभावना को शून्य के करीब भी कम करता है।
बेसिल बोर्के

@ रेनीपेट Eh, यदि आप वह पागल हैं, और आपको एक नया बनाते समय पहले से उपयोग की जाने वाली ID की सूची तक पहुँच प्राप्त हो गई है, तो आप whileतब तक नए उत्पन्न करते हैं जब तक कि आपको एक ऐसा न मिल जाए जो आपकी सूची के अंदर नहीं है: p
Nyerguds

1
ओरेकल क्रिप्टो यादृच्छिक संख्या जनरेटर आमतौर पर एक यादृच्छिक बीज के साथ एक PRNG है। यादृच्छिक बीज आमतौर पर ओएस द्वारा प्रदान किए गए "एन्ट्रॉपी" के स्रोत का उपयोग करके प्राप्त किया जाता है। यदि आप उस स्रोत को नीचा दिखा सकते हैं या समझौता कर सकते हैं, तो समान संख्या में उत्पादन करने वाले एक क्रिप्टो यादृच्छिक संख्या जनरेटर की संभावना बढ़ जाती है। यह भी ध्यान देने योग्य है कि कुछ (जैसे वर्चुअलाइज्ड) प्लेटफार्मों पर, ओएस एंट्रोपी से बाहर चला सकता है। इसे हल करने के लिए "डॉगी हैक्स" हैं, लेकिन वे एन्ट्रापी की गुणवत्ता को नीचा दिखाते हैं।
स्टीफन सी

यह सिर्फ एक अकादमिक चिंता नहीं है। मैंने देखा है एक ( असत्यापित !! ) का दावा है कि किसी ने यादृच्छिक-आधारित यूयूआईडी के साथ समस्याओं में भाग लिया, जो अद्वितीय नहीं है।
स्टीफन सी।

31

यह निर्भर करता है कि आप किस तरह का यूयूआईडी चाहते हैं।

  • मानक जावा UUIDवर्ग संस्करण 4 (यादृच्छिक) UUIDs उत्पन्न करता है । ( अद्यतन - संस्करण 3 (नाम) यूयूआईडी भी उत्पन्न किया जा सकता है।) यह अन्य वेरिएंट को भी संभाल सकता है, हालांकि यह उन्हें नुकसान नहीं पहुंचा सकता है। (इस मामले में, "संभाल" का अर्थ UUIDहै long, byte[]या Stringप्रतिनिधित्व से उदाहरणों का निर्माण करना , और कुछ उपयुक्त एक्सेसर्स प्रदान करना।)

  • जावा UUID जेनरेटर (सुराही) "के रूप में द्वारा परिभाषित सभी 3 'सरकारी' UUID के प्रकार कार्यान्वयन अभिप्राय समर्थन करने के लिए RFC-4122 " ... हालांकि आरएफसी वास्तव में 4 प्रकार परिभाषित करता है और एक 5 वीं प्रकार का उल्लेख है।

UUID प्रकारों और प्रकारों के बारे में अधिक जानकारी के लिए, विकिपीडिया में एक अच्छा सारांश है , और gory विवरण RFC 4122 और अन्य विशिष्टताओं में हैं।


1
पूरी तरह से सच नहीं है, यह भी नाम-आधारित (संस्करण 3) UUIDs के साथ उत्पन्न कर सकता हैUUID.nameUUIDFromBytes(byte[] name)
डेनिसके

मुझे सही साबित होना है। मैं javadoc विवरण पर निर्भर करता हूं जो कहता है कि "स्थिर बाइट सरणी के आधार पर एक प्रकार 3 (नाम आधारित) UUID को पुनः प्राप्त करने के लिए स्टेटिक कारखाना ।"
स्टीफन सी

मुझे नहीं लगता कि पोस्ट सटीक है। UUID जावा डॉक्स राज्य निर्माता एक टाइप 2 प्रकार, यादृच्छिक नहीं उत्पन्न करता है। टाइप 3 उपयोग के लिए public static UUID nameUUIDFromBytes(byte[] name)। टाइप 4 उपयोग के लिए public static UUID randomUUID()। JDK वर्ग के साथ टाइप 1 उपलब्ध नहीं है।
slartibartfast

नहीं, मुझे लगता है कि मुझे यह बहुत सही लगा। Javadocs राज्य: "हालांकि निर्माता यूयूआईडी के किसी भी प्रकार (नीचे वर्णित) के निर्माण की अनुमति देते हैं।" और 4 वेरिएंट नीचे सूचीबद्ध किए गए हैं, जिनमें टाइप 1 शामिल हैं। वास्तव में, इसके लिए जेवाडॉक पढ़ेंclockSequence()
स्टीफन सी

27

बस एक उदाहरण के साथ मार्क बायर्स के जवाब का विस्तार करने के लिए:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

6

अन्य उत्तर सही हैं, खासकर स्टीफन सी द्वारा यह एक

जावा के बाहर तक पहुँचना

जावा के भीतर एक यूयूआईडी मूल्य उत्पन्न करना सुरक्षा चिंताओं के कारण संस्करण 4 (यादृच्छिक) तक सीमित है ।

यदि आप यूयूआईडी के अन्य संस्करण चाहते हैं, तो एक एवेन्यू आपके जावा ऐप को जेवीएम के बाहर पहुंचकर कॉल करने के लिए यूयूआईडी बनाने के लिए है:

  • कमांड-लाइन उपयोगिता
    लगभग हर ऑपरेटिंग सिस्टम के साथ बंडल की गई है।
    उदाहरण के लिए, uuidgenमैक ओएस एक्स, बीएसडी और लिनक्स में पाया जाता है।
  • डेटाबेस सर्वर JDBC का
    उपयोग डेटाबेस सर्वर पर उत्पन्न UUID को पुनः प्राप्त करने के लिए करता है। उदाहरण के लिए, अक्सर पोस्टग्रेज के साथ एक्सटेंशन को बंडल किया जाता है । यह विस्तार संस्करण 1, 3 और 4 मान उत्पन्न कर सकता है और इसके अतिरिक्त कुछ भिन्नताएं भी दे सकता है:
    uuid-ossp
    • uuid_generate_v1mc() - एक संस्करण 1 यूयूआईडी बनाता है लेकिन कंप्यूटर के वास्तविक मैक पते के बजाय एक यादृच्छिक मल्टीकास्ट मैक पते का उपयोग करता है।
    • uuid_generate_v5(namespace uuid, name text) - एक संस्करण 5 UUID बनाता है, जो संस्करण 3 UUID की तरह काम करता है सिवाय इसके कि SHA-1 का उपयोग हैशिंग विधि के रूप में किया जाता है।
  • वेब सेवा
    उदाहरण के लिए, UUID जेनरेटर संस्करण 1 और 3 भी बनाता है शून्य मान और GUID

3
आपके उत्तर के साथ मेरे पास कुछ मुद्दे हैं: पहले, यह पहले से ही गलत दिखाया गया था कि आप केवल मानक जावा लाइब्रेरी से V4 प्राप्त कर सकते हैं (V3 भी संभव है)। दूसरे, आप इसे ऐसे बनाते हैं जैसे कि मानक पुस्तकालय के अलावा जावा के भीतर कोई विकल्प नहीं है, साथ ही "सुरक्षा चिंताओं के कारण" एक हाथ से लहराती है। और अंत में, यह आमतौर पर अक्षम (प्रोग्रामिंग- और / या प्रदर्शन-वार) बाहरी स्रोतों के आधार पर शुरू करने के लिए है, जब जावा के भीतर इसे करने के बहुत सारे तरीके हैं (जब तक कि आपको उन में इसकी आवश्यकता नहीं है, ज़ाहिर है, जैसे कि इसे बनाने के हिस्से के रूप में। SQL सर्वर में रिकॉर्ड)।
डेनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.