किस UUID संस्करण का उपयोग करना है?


332

आपको UUID के किस संस्करण का उपयोग करना चाहिए? मैंने बहुत सारे थ्रेड को यह समझाते हुए देखा कि प्रत्येक संस्करण में क्या होता है, लेकिन मुझे यह पता लगाने में परेशानी हो रही है कि क्या अनुप्रयोगों के लिए सबसे अच्छा है।


2
आपकी पसंद क्या हैं?
गाबे

अजगर के साथ जो भी काम करता है। इसलिए मुझे लगता है कि यह docs.python.org/2/library/uuid.html है । 1,3,4,5।
user1802143

यदि आप संस्करण 3 और 5 के बारे में उत्सुक हैं, तो यह प्रश्न देखें, v5 UUID उत्पन्न करना। नाम और नाम स्थान क्या है?
बेसिल बोर्क

जवाबों:


414

यूयूआईडी बनाने के दो अलग-अलग तरीके हैं।

यदि आपको केवल एक विशिष्ट आईडी की आवश्यकता है, तो आप संस्करण 1 या संस्करण 4 चाहते हैं।

  • संस्करण 1: यह नेटवर्क कार्ड मैक पते और टाइमर के आधार पर एक अद्वितीय आईडी बनाता है। ये आईडी भविष्यवाणी करना आसान है (एक दिया गया है, मैं एक और अनुमान लगाने में सक्षम हो सकता हूं) और आपके नेटवर्क कार्ड पर वापस पता लगाया जा सकता है। इन्हें बनाने की अनुशंसा नहीं की गई है।

  • संस्करण 4: ये यादृच्छिक (या छद्म-यादृच्छिक) संख्याओं से उत्पन्न होते हैं। यदि आपको केवल UUID उत्पन्न करने की आवश्यकता है, तो संभवतः यही आप चाहते हैं।

यदि आपको हमेशा दिए गए नाम से एक ही UUID उत्पन्न करना है, तो आप एक संस्करण 3 या संस्करण 5 चाहते हैं।

  • संस्करण 3: यह एक नाम और नाम के MD5 हैश से एक अद्वितीय आईडी बनाता है। यदि आपको बैकवर्ड संगतता की आवश्यकता है (एक अन्य प्रणाली के साथ जो नामों से यूयूआईडी बनाता है), इसका उपयोग करें।

  • संस्करण 5: यह नाम और नाम के SHA-1 हैश से एक अद्वितीय आईडी बनाता है। यह पसंदीदा संस्करण है।


17
मैं जोड़ूंगा: यदि आपको reproducibleकिसी दिए गए नाम से UUID उत्पन्न करना है, तो आपको एक संस्करण 3 या संस्करण 5 चाहिए। यदि आप उस एल्गोरिथ्म को उसी इनपुट में फीड करते हैं, तो यह उसी आउटपुट को उत्पन्न करेगा।
ऐरजेन

3
क्लाउड कंप्यूटिंग वातावरण (जैसे AWS या GAE) में, ऐसा लगता है कि संस्करण 1 की कमजोरी गुमनामी में बदल गई है। जहां समय के साथ किसी दिए गए एप्लिकेशन के यूयूआईडी जनरेटर पर लागू होने वाले हजारों विभिन्न मैक पते होने की संभावना है, भविष्यवाणी और / या ट्रैसेबिलिटी को समाप्त करना।
बफेलो रबोर

3
@ user239558 एक UUID के लिए लक्ष्य को देखते हुए इसकी विशिष्टता है, UUIDv5 को अभी भी पसंद किया जा सकता है।
एपिक्यूरिस्ट

7
संस्करण 1 के बारे में टिप्पणी "अनुशंसित नहीं" है, अत्यधिक सरलीकृत है। कई स्थितियों में, ये वास्तव में ठीक और बेहतर हैं। लेकिन यदि आपके पास यूयूआईडी से इन सूचनाओं के किसी भी सामान को लीक करने के बारे में सुरक्षा चिंताएं हैं, जो कि अविश्वसनीय अभिनेताओं को उपलब्ध कराई जा सकती हैं: (ए) यूयूआईडी बनाने वाली मशीन का मैक पता, या (ख) इसे बनाए जाने की तारीख फिर संस्करण 1 से बचें। यदि जानकारी के दो टुकड़े संवेदनशील नहीं हैं, तो संस्करण 1 जाने का एक शानदार तरीका है।
बासिल बॉर्क

9
संस्करण 2 का क्या हुआ?
मैथ्यू वू

53

यदि आप एक यादृच्छिक संख्या चाहते हैं, तो एक यादृच्छिक संख्या पुस्तकालय का उपयोग करें। यदि आप प्रभावी रूप से 0.00 के साथ एक अद्वितीय पहचानकर्ता चाहते हैं ... यहाँ कई और 0 ... टक्कर की 001% संभावना है, तो आपको UUIDL1 का उपयोग करना चाहिए। UUIDv3 और v5 के लिए निक की पोस्ट देखें।

UUIDv1 सुरक्षित नहीं है। यह होने का मतलब नहीं है। यह UNIQUE होने के लिए है, गैर-अनुमान योग्य नहीं है। UUIDv1 वर्तमान टाइमस्टैम्प का उपयोग करता है, साथ ही एक मशीन पहचानकर्ता, और कुछ यादृच्छिक-ईश सामान को एक संख्या बनाने के लिए जो उस एल्गोरिथ्म द्वारा फिर से उत्पन्न नहीं किया जाएगा। यह एक लेनदेन आईडी के लिए उपयुक्त है (भले ही हर कोई लाखों लेनदेन / लेनदेन कर रहा हो)।

ईमानदार होने के लिए, मुझे समझ में नहीं आता कि UUIDv4 क्यों मौजूद है ... RFC4122 को पढ़ने से , ऐसा लगता है कि संस्करण टकराव की संभावना को समाप्त नहीं करता है। यह सिर्फ एक यादृच्छिक संख्या जनरेटर है। अगर यह सच है, तो आपके पास दुनिया में दो मशीनों का बहुत अच्छा मौका है, अंततः एक ही "यूयूआईडी" वी 4 (उद्धरण क्योंकि U.niversal U.niqueness की गारंटी के लिए कोई तंत्र नहीं है) बना रहा है। उस स्थिति में, मुझे नहीं लगता कि एल्गोरिथ्म एक आरएफसी में है जो अद्वितीय मूल्यों को उत्पन्न करने के तरीकों का वर्णन करता है। यह यादृच्छिकता उत्पन्न करने के बारे में एक RFC में होगा। यादृच्छिक संख्याओं के एक सेट के लिए:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

67
आप दो यूयूआईडी संस्करण 4 कार्यान्वयन टकराते नहीं देखेंगे, जब तक कि आप एक सदी के लिए हर सेकंड एक बिलियन यूयूआईडी उत्पन्न न करें और एक सिक्का फ्लिप जीतें । याद रखें, set_size2 ^ 122 है, जो बहुत बड़ा है
केविन

8
V4 एल्गोरिथ्म धारावाहिक नहीं है, जिसका अर्थ है कि एक मौका है कि v4 द्वारा उत्पन्न पहले दो UUIDs मेल खा सकते हैं। सिर्फ इसलिए कि कई विकल्प हैं, इसका मतलब यह नहीं है कि आपको दोहराने से पहले अद्वितीय विकल्पों से बाहर भागना होगा। जो कभी भी हो सकता है।
ऐरजेन

7
आप वास्तव में गणित करने में असफल हो रहे हैं। हम (एक प्रजाति के रूप में) हर सेकंड 1 बिलियन यूयूआईडी पैदा नहीं कर रहे हैं। इसलिए हमारे पास पहली टक्कर (औसतन) तक 100 साल से अधिक का समय है।
केविन

31
V4 "टकरा सकता है", लेकिन संभावना असाधारण रूप से कम है कि अधिकांश उपयोग-मामलों के लिए इसके जोखिम के लायक है। पुन: "दुनिया में दो मशीनें अंततः एक ही 'UUID'v4" का निर्माण कर रही हैं, ठीक है, निश्चित है, लेकिन यह कोई समस्या नहीं है क्योंकि दुनिया की ज्यादातर मशीनें जो UUID का उपयोग करती हैं, उन्हें अलग-अलग संदर्भों में उपयोग करती हैं। मेरा मतलब है, अगर मैं अपने खुद के आंतरिक ऐप के लिए उसी यूयूआईडी को उत्पन्न करता हूं जैसे आप अपने आंतरिक ऐप के लिए करते हैं, तो इससे कोई फर्क नहीं पड़ता। यदि वे एक ही संदर्भ में होते हैं तो टकराव केवल मायने रखता है। (याद रखें, एक ऐप के भीतर भी, कई UUID का पूरे ऐप में अद्वितीय होना

6
तो ऐसा लगता है, यदि आपको अपने गाइड को सुरक्षित करने की आवश्यकता नहीं है, तो संस्करण 1 का उपयोग करें। यदि आपको इसे सुरक्षित करने की आवश्यकता है, और भाग्यशाली महसूस करें (या वास्तव में, अशुभ महसूस न करें) संस्करण 4 का उपयोग करें
Vaccano

16

यह एक बहुत ही सामान्य प्रश्न है। एक उत्तर है: "यह निर्भर करता है कि आप किस प्रकार का यूयूआईडी उत्पन्न करना चाहते हैं"। लेकिन एक बेहतर यह है: "ठीक है, इससे पहले कि मैं जवाब दूं, क्या आप हमें बता सकते हैं कि आपको यूयूआईडी पीढ़ी की कार्यक्षमता को कॉल करने के बजाय अपने स्वयं के यूयूआईडी पीढ़ी एल्गोरिथ्म को कोड करने की आवश्यकता क्यों है जो अधिकांश आधुनिक ऑपरेटिंग सिस्टम प्रदान करते हैं?"

ऐसा करना आसान और सुरक्षित है, और चूंकि आपको शायद अपना खुद का सृजन करने की आवश्यकता नहीं है , इसलिए आपको एक कोडिंग को परेशान क्यों करना है? उस स्थिति में, उत्तर आपके ओ / एस, प्रोग्रामिंग भाषा या ढांचे को जो भी प्रदान करता है उसका उपयोग करता है। उदाहरण के लिए, विंडोज में, CoCreateGuid या UuidCreate या उपयोग में कई रूपरेखाओं से उपलब्ध विभिन्न आवरणों में से एक है। लिनक्स में uuid_generate है

यदि आप किसी कारण से, अपने स्वयं के उत्पन्न करने की आवश्यकता है, तो कम से कम v1 और v2 UUIDs उत्पन्न करने से दूर रहने का अच्छा अर्थ है । यह सही पाने के लिए मुश्किल है। स्टिक, इसके बजाय, v3, v4 या v5 UUIDs के लिए।

अपडेट : एक टिप्पणी में, आप उल्लेख करते हैं कि आप पायथन का उपयोग कर रहे हैं और इससे लिंक करते हैं । उपलब्ध कराए गए इंटरफ़ेस के माध्यम से, आपके लिए सबसे आसान विकल्प कॉलिंग के माध्यम से एक v4 UUID (जो यादृच्छिक डेटा से बनाया गया है) उत्पन्न करना होगा uuid.uuid4()

यदि आपके पास कुछ डेटा है जिसे आपको UUID बनाने के लिए (या कैन) हैश करना है, तो आप v3 (जो MD5 पर निर्भर करता है) या v5 (जो SHA1 पर निर्भर करता है) का उपयोग कर सकते हैं। V3 या v5 UUID उत्पन्न करना सरल है: पहले उस UUID प्रकार को चुनें जिसे आप उत्पन्न करना चाहते हैं (आपको संभवतः v5 चुनना चाहिए) और फिर उपयुक्त नाम स्थान चुनें और उस डेटा के साथ फ़ंक्शन को कॉल करें जिसका उपयोग आप UIDID से उत्पन्न करने के लिए करना चाहते हैं। उदाहरण के लिए, यदि आप एक URL का उपयोग करते हैं, तो आप इसका उपयोग करेंगे NAMESPACE_URL:

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

कृपया ध्यान दें कि यह UUID एक ही URL के लिए v5 UUID से अलग होगा, जो इस तरह से बनाया गया है:

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

V3 और v5 URL की एक अच्छी संपत्ति यह है कि उन्हें कार्यान्वयन के बीच अंतर होना चाहिए। दूसरे शब्दों में, यदि दो अलग-अलग प्रणालियां एक कार्यान्वयन का उपयोग कर रही हैं जो RFC4122 का अनुपालन करती हैं, तो वे (या कम से कम चाहिए ) दोनों एक ही UUID उत्पन्न करते हैं यदि अन्य सभी चीजें समान हैं (यानी एक ही नाम UUID को उत्पन्न कर रहे हैं, एक ही नाम और एक ही डेटा)। यह संपत्ति कुछ स्थितियों (विशेष रूप से सामग्री-पता योग्य भंडारण परिदृश्यों) में बहुत सहायक हो सकती है , लेकिन शायद आपके विशेष मामले में नहीं।


4
मुझे लगता है कि ऐसा इसलिए होगा क्योंकि ओपी ने यह नहीं पूछा: मैं यूयूआईडी पीढ़ी की कार्यक्षमता को कॉल करने के बजाय "यू] खुद के यूयूआईडी पीढ़ी एल्गोरिथ्म को कैसे कोड करता हूं जो कि अधिकांश आधुनिक ऑपरेटिंग सिस्टम प्रदान करते हैं?"
ऐरजेन

इसके अलावा, मुझे लगता है कि यह UUIDv3 और v5 की एक अच्छी व्याख्या है। नीचे मेरा जवाब देखें कि मुझे क्यों लगता है कि v1 एक अच्छा विकल्प हो सकता है।
ऐरजेन

NAMESPACE_URL क्या है? यह एक चर है जो मुझे मिल सकता है? कहाँ से?
स्टैकडेव

@stackdave NAMESPACE_URLएक UUID है, जो आमतौर 6ba7b811-9dad-11d1-80b4-00c04fd430c8पर RFC-4122 के पेज 30 पर की गई सिफारिश के बराबर है ।
जेमी रिडिंग

2

डाक्यूमेंट्स डाक्यूमेंट्सUUID एस के बीच के अंतर का वर्णन करता है । उनमें से एक जोड़ी:

वी 3:

uuid_generate_v3(namespace uuid, name text) - यह फ़ंक्शन निर्दिष्ट इनपुट नाम का उपयोग करके दिए गए नाम स्थान में एक संस्करण 3 UUID उत्पन्न करता है।

वी 4:

uuid_generate_v4 - यह फ़ंक्शन एक संस्करण 4 यूयूआईडी बनाता है, जो पूरी तरह से यादृच्छिक संख्याओं से प्राप्त होता है।

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