आपको UUID के किस संस्करण का उपयोग करना चाहिए? मैंने बहुत सारे थ्रेड को यह समझाते हुए देखा कि प्रत्येक संस्करण में क्या होता है, लेकिन मुझे यह पता लगाने में परेशानी हो रही है कि क्या अनुप्रयोगों के लिए सबसे अच्छा है।
आपको UUID के किस संस्करण का उपयोग करना चाहिए? मैंने बहुत सारे थ्रेड को यह समझाते हुए देखा कि प्रत्येक संस्करण में क्या होता है, लेकिन मुझे यह पता लगाने में परेशानी हो रही है कि क्या अनुप्रयोगों के लिए सबसे अच्छा है।
जवाबों:
यूयूआईडी बनाने के दो अलग-अलग तरीके हैं।
यदि आपको केवल एक विशिष्ट आईडी की आवश्यकता है, तो आप संस्करण 1 या संस्करण 4 चाहते हैं।
संस्करण 1: यह नेटवर्क कार्ड मैक पते और टाइमर के आधार पर एक अद्वितीय आईडी बनाता है। ये आईडी भविष्यवाणी करना आसान है (एक दिया गया है, मैं एक और अनुमान लगाने में सक्षम हो सकता हूं) और आपके नेटवर्क कार्ड पर वापस पता लगाया जा सकता है। इन्हें बनाने की अनुशंसा नहीं की गई है।
संस्करण 4: ये यादृच्छिक (या छद्म-यादृच्छिक) संख्याओं से उत्पन्न होते हैं। यदि आपको केवल UUID उत्पन्न करने की आवश्यकता है, तो संभवतः यही आप चाहते हैं।
यदि आपको हमेशा दिए गए नाम से एक ही UUID उत्पन्न करना है, तो आप एक संस्करण 3 या संस्करण 5 चाहते हैं।
संस्करण 3: यह एक नाम और नाम के MD5 हैश से एक अद्वितीय आईडी बनाता है। यदि आपको बैकवर्ड संगतता की आवश्यकता है (एक अन्य प्रणाली के साथ जो नामों से यूयूआईडी बनाता है), इसका उपयोग करें।
संस्करण 5: यह नाम और नाम के SHA-1 हैश से एक अद्वितीय आईडी बनाता है। यह पसंदीदा संस्करण है।
reproducible
किसी दिए गए नाम से UUID उत्पन्न करना है, तो आपको एक संस्करण 3 या संस्करण 5 चाहिए। यदि आप उस एल्गोरिथ्म को उसी इनपुट में फीड करते हैं, तो यह उसी आउटपुट को उत्पन्न करेगा।
यदि आप एक यादृच्छिक संख्या चाहते हैं, तो एक यादृच्छिक संख्या पुस्तकालय का उपयोग करें। यदि आप प्रभावी रूप से 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)
set_size
2 ^ 122 है, जो बहुत बड़ा है ।
यह एक बहुत ही सामान्य प्रश्न है। एक उत्तर है: "यह निर्भर करता है कि आप किस प्रकार का यूयूआईडी उत्पन्न करना चाहते हैं"। लेकिन एक बेहतर यह है: "ठीक है, इससे पहले कि मैं जवाब दूं, क्या आप हमें बता सकते हैं कि आपको यूयूआईडी पीढ़ी की कार्यक्षमता को कॉल करने के बजाय अपने स्वयं के यूयूआईडी पीढ़ी एल्गोरिथ्म को कोड करने की आवश्यकता क्यों है जो अधिकांश आधुनिक ऑपरेटिंग सिस्टम प्रदान करते हैं?"
ऐसा करना आसान और सुरक्षित है, और चूंकि आपको शायद अपना खुद का सृजन करने की आवश्यकता नहीं है , इसलिए आपको एक कोडिंग को परेशान क्यों करना है? उस स्थिति में, उत्तर आपके ओ / एस, प्रोग्रामिंग भाषा या ढांचे को जो भी प्रदान करता है उसका उपयोग करता है। उदाहरण के लिए, विंडोज में, 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 को उत्पन्न कर रहे हैं, एक ही नाम और एक ही डेटा)। यह संपत्ति कुछ स्थितियों (विशेष रूप से सामग्री-पता योग्य भंडारण परिदृश्यों) में बहुत सहायक हो सकती है , लेकिन शायद आपके विशेष मामले में नहीं।
NAMESPACE_URL
एक UUID है, जो आमतौर 6ba7b811-9dad-11d1-80b4-00c04fd430c8
पर RFC-4122 के पेज 30 पर की गई सिफारिश के बराबर है ।
डाक्यूमेंट्स डाक्यूमेंट्सUUID
एस के बीच के अंतर का वर्णन करता है । उनमें से एक जोड़ी:
वी 3:
uuid_generate_v3(namespace uuid, name text)
- यह फ़ंक्शन निर्दिष्ट इनपुट नाम का उपयोग करके दिए गए नाम स्थान में एक संस्करण 3 UUID उत्पन्न करता है।
वी 4:
uuid_generate_v4
- यह फ़ंक्शन एक संस्करण 4 यूयूआईडी बनाता है, जो पूरी तरह से यादृच्छिक संख्याओं से प्राप्त होता है।