2012-06-03 11 views
51

मैंने man पृष्ठ पढ़ा है, लेकिन मुझे यह नहीं पता कि name और namespace क्या हैं।वी 5 यूयूआईडी उत्पन्न करना। नाम और नामस्थान क्या है?

संस्करण 3 और संस्करण 5 के लिए यूयूआईडी अतिरिक्त कमांड लाइन तर्क नामस्थान और नाम देना होगा। नामस्थान या तो स्ट्रिंग प्रतिनिधित्व में एक यूयूआईडी या आंतरिक रूप से पूर्व-परिभाषित नेमस्पेस यूयूआईडीएस (वर्तमान में ज्ञात "एनएस: डीएनएस", "एनएस: यूआरएल", "एनएस: ओआईडी", और "एनएस: एक्स 500") के लिए पहचानकर्ता है। । नाम मनमाने ढंग से लंबाई की एक स्ट्रिंग है।

नाम स्थान:

नाम स्थान या तो स्ट्रिंग प्रतिनिधित्व में एक UUID या एक

यह मतलब यह है कि मैं इसे (UUID v4) संग्रहीत करने की आवश्यकता के साथ संबंध में कहीं है उत्पन्न यूयूआईडी v5? किसी भी मामले में, यह स्वचालित रूप से क्यों नहीं किया जाता है?

नाम मनमाने ढंग से लंबाई की एक स्ट्रिंग है।

name एक पूरी तरह से यादृच्छिक स्ट्रिंग? तब इसका उद्देश्य क्या है? क्या इसे यूयूआईडी वी 5 से डीकोड किया जा सकता है?

उत्तर

46

नाम और नामस्थान का उपयोग (बहुत संभवतः) अद्वितीय यूयूआईडी का पदानुक्रम बनाने के लिए किया जा सकता है।

काफी बोलते हुए, एक प्रकार 3 या टाइप 5 यूयूआईडी एक नाम के साथ नामस्थान पहचानकर्ता को एक साथ जोड़कर उत्पन्न होता है। टाइप 3 यूयूआईडी एमडी 5 का उपयोग करें और टाइप 5 यूयूआईडीएस SHA1 का उपयोग करें। केवल 128-बिट उपलब्ध हैं और प्रकार को निर्दिष्ट करने के लिए 5 बिट्स का उपयोग किया जाता है, इसलिए सभी हैश बिट्स इसे यूयूआईडी में नहीं बनाते हैं। (इसके अलावा एमडी 5 को क्रिप्टोग्राफिक रूप से टूटा माना जाता है, और एसएचए 1 अपने आखिरी पैरों पर है, इसलिए इसे "बहुत सुरक्षित" होने वाले डेटा को सत्यापित करने के लिए इसका उपयोग न करें)। उस ने कहा, यह आपको संभावित रूप से अद्वितीय 128-बिट मान पर संभावित रूप से पदानुक्रमित नाम को दोहराने योग्य/सत्यापित करने योग्य "हैश" फ़ंक्शन बनाने का एक तरीका देता है, संभावित रूप से पदानुक्रमित हैश या मैक की तरह अभिनय करता है।

मान लें कि आपके पास एक (कुंजी, मान) स्टोर है, लेकिन यह केवल एक नामस्थान का समर्थन करता है। आप टाइप 3 या टाइप 5 यूयूआईडी का उपयोग करके बड़ी संख्या में विशिष्ट लॉजिकल नेमस्पेस उत्पन्न कर सकते हैं। सबसे पहले, प्रत्येक नेमस्पेस के लिए रूट यूयूआईडी बनाएं। यह एक प्रकार 1 (होस्ट + टाइमस्टैंप) हो सकता है या 4 (यादृच्छिक) यूयूआईडी टाइप कर सकता है जब तक आप इसे कहीं भी छीनते हैं। वैकल्पिक रूप से आप एक अपनी रूट के लिए यादृच्छिक यूयूआईडी (या शून्य UUID: 00000000-0000-0000-0000-000000000000 रूट के रूप में उपयोग करें) बना सकते हैं और फिर "uuid -v5 $ ROOTUUID $ NAMESPACENAME" का उपयोग करके प्रत्येक नेमस्पेस के लिए एक पुन: उत्पादित यूयूआईडी बना सकते हैं। । अब आप "uuid -v5 $ NAMESPACEUUID $ कुंजी" का उपयोग करके नामस्थान के भीतर कुंजियों के लिए अद्वितीय यूयूआईडी बना सकते हैं। इन यूयूआईडी को टक्कर से बचने की उच्च संभावना के साथ एक सिंगल की-वैल्यू स्टोर में फेंक दिया जा सकता है। इस प्रक्रिया को बार-बार दोहराया जा सकता है ताकि यदि उदाहरण के लिए यूयूआईडी कुंजी से जुड़े "मान" को बाल्टी, कंटेनर या निर्देशिका जैसे कुछ प्रकार के तार्किक "नेमस्पेस" का प्रतिनिधित्व किया जाता है, तो इसके यूयूआईडी का उपयोग अधिक पदानुक्रमित करने के लिए किया जा सकता है UUIDs।

जेनरेट किए गए प्रकार 3 या टाइप 5 यूयूआईडी में नेमस्पेस आईडी और नाम-इन-नेमस्पेस (कुंजी) का एक (आंशिक) हैश है। यह संदेश मैक के मुकाबले नामस्थान UUID नहीं रखता है मैक संदेश से संबंधित एन्कोड किए गए संदेश की सामग्री रखता है। नाम यूयूआईडी एल्गोरिदम के परिप्रेक्ष्य से "मनमानी" (ऑक्टेट) स्ट्रिंग है। इसका अर्थ हालांकि आपके आवेदन पर निर्भर करता है। यह एक लॉजिकल निर्देशिका, ऑब्जेक्ट-आईडी के भीतर एक ऑब्जेक्ट-स्टोर, आदि के भीतर एक फ़ाइल नाम हो सकता है।

हालांकि यह मामूली बड़ी संख्या में नामस्थानों और चाबियों के लिए अच्छी तरह से काम करता है, यह अंततः भाप से बाहर चला जाता है यदि आप बहुत अधिक संभावनाओं के साथ अद्वितीय हैं जो बहुत बड़ी संख्या के लिए अद्वितीय हैं। जन्मदिन की समस्या (उर्फ बर्थडे पैराडाक्स) के लिए विकिपीडिया प्रविष्टि में एक सारणी शामिल है जो विभिन्न प्रकार की चाबियों और टेबल आकारों के लिए कम से कम एक टक्कर की संभावनाएं देती है। 128-बिट्स के लिए, 26 अरब कुंजियों के लिए इस तरह से पी = 10^-18 (नगण्य) की टक्कर की संभावना है, लेकिन 26 ट्रिलियन चाबियाँ, कम से कम एक टकराव की संभावना को पी = 10^-12 (एक में एक ट्रिलियन), और हैशिंग 26 * 10^15 चाबियाँ, पी = 10^-6 (दस लाख में से एक) तक कम से कम एक टक्कर की संभावना को बढ़ाती हैं। यूयूआईडी प्रकार को एन्कोड करने वाले 5 बिट्स के लिए समायोजन, यह कुछ हद तक तेजी से चला जाएगा, इसलिए एक ट्रिलियन कुंजियों में लगभग एक टकराव होने का लगभग 1-एक-ट्रिलियन मौका होता है।

संभावना तालिका के लिए http://en.wikipedia.org/wiki/Birthday_problem#Probability_table देखें।

यूयूआईडी एन्कोडिंग पर अधिक जानकारी के लिए http://www.ietf.org/rfc/rfc4122.txt देखें।

106

टाइप 3 और टाइप 5 यूयूआईडी एक यूयूआईडी में हैश भरने की एक तकनीक है।

  • टाइप 1: सामान मैक पता, 128 बिट
  • प्रकार 3 में दिनांक: सामान 128 बिट
  • प्रकार 4 में एक MD5 हैश: 128 बिट
  • प्रकार 5 में यादृच्छिक डेटा सामान: एसएचए 1 हैश 128 बिट्स

एक SHA1 हैश 160 बिट्स (20 बाइट्स) आउटपुट करता है। हैश का परिणाम यूयूआईडी में परिवर्तित हो गया है। SHA1 से 20 बाइट्स से:

SHA1 Digest: 74738ff5 5367 e958 9aee 98fffdcd1876 94028007 
UUID (v5):  74738ff5-5367-5958-9aee-98fffdcd1876 
          ^_low nibble is set to 5 to indicate type 5 
            ^_first two bits set to 1 and 0, respectively 

(ध्यान दें कि की '9' पहले दो बिट्स पहले से ही 1 और 0 क्रमशः रहे हैं, है, तो यह कोई प्रभाव नहीं है)।

मैं हैश क्या करूँ?

आप शायद सोच रहे हैं कि मुझे हैश क्या है। मूल रूप से आप के संयोजन हैश:

sha1([NamespaceUUID]+[AnyString]); 

आप एक तथाकथित नाम स्थान के साथ अपने स्ट्रिंग उपसर्ग नाम संघर्ष को रोकने के लिए।

UUID RFC चार नामस्थान आप के लिए पहले से परिभाषित करता है:

  • NameSpace_DNS: {6ba7b810-9dad-11d1-80b4-00c04fd430c8}
  • NameSpace_URL: {6ba7b811-9dad-11d1-80b4-00c04fd430c8}
  • NameSpace_OID: {6ba7b812-9dad-11d1-80b4-00c04fd430c8}
  • NameSpace_X500: {6ba7b814-9dad-11d1-80b4-00c04fd430c8}

तो, आप एक साथ हैश सकता है:

StackOverflowDnsUUID = sha1(Namespace_DNS + "stackoverflow.com"); 
StackOverflowUrlUUID = sha1(Namespace_URL + "stackoverflow.com"); 

आरएफसी तो परिभाषित करता है कि कैसे करने के लिए:

  • SHA1
  • से 160 बिट्स लेने के लिए और यह एक UUID के 128 बिट में तब्दील

मूलभूत बात केवल 128 बिट्स लेना है, 5 में रिकॉर्ड टाइप करें, और फिर clock_seq_hi_and_reserved सेक्शन के पहले दो बिट क्रमश: 1 और 0 पर सेट करें।

अधिक उदाहरण

अब आप एक समारोह है कि एक तथाकथित नाम उत्पन्न करता है तो आप उसे समारोह (छद्म कोड में) हो सकता है:

UUID NameToUUID(UUID NamespaceUUID, String Name) 
{ 
    byte[] hash = sha1(NamespaceUUID.ToBytes() + Name.ToBytes()); 
    UUID result; 
    Copy(hash, result, 16); 
    result[6] &= 0x0F; 
    result[6] |= 0x50; 
    result[8] &= 0x3F; 
    result[8] |= 0x80; 
    return result; 
} 

(ध्यान दें कि endian

uuid = NameToUUID(Namespace_DNS, 'www.stackoverflow.com'); 
uuid = NameToUUID(Namespace_DNS, 'www.google.com'); 
uuid = NameToUUID(Namespace_URL, 'http://www.stackoverflow.com'); 
uuid = NameToUUID(Namespace_URL, 'http://www.google.com/search&q=rfc+4112'); 
uuid = NameToUUID(Namespace_URL, 'http://stackoverflow.com/questions/5515880/test-vectors-for-uuid-version-5-converting-hash-into-guid-algorithm'); 
: आपके सिस्टम की -नेस ऊपर बाइट्स की सूचकांकों)

आप कर सकते हैं कॉल प्रभावित कर सकते हैं

अब वापस अपने प्रश्न

संस्करण 3 और संस्करण के लिए करने के लिए 5 UUIDs अतिरिक्त आदेश पंक्ति तर्क नाम स्थान और नाम दिया जाना है। नेमस्पेस या तो स्ट्रिंग प्रस्तुति या आंतरिक रूप से पूर्व-परिभाषित नेमस्पेस यूयूआईडीएस (जिसे वर्तमान में "एनएस: डीएनएस", "एनएस: यूआरएल", "एनएस: ओआईडी", और "एनएस: एक्स 500") के लिए पहचानकर्ता में यूयूआईडी है। नाम मनमाने ढंग से लंबाई की एक स्ट्रिंग है।

नेमस्पेस जो भी आपको पसंद है यूयूआईडी है। यह पूर्व निर्धारित लोगों में से एक हो सकता है, या आप अपने स्वयं उदाहरण के कर सकते हैं, .:

UUID Namespace_RectalForeignExtractedObject = '4d79546f-6e67-7565-496e-486572417373' 

नाम मनमाना लंबाई के एक स्ट्रिंग है।

नाम केवल पाठ आप नाम स्थान के साथ जोड़ दिया है करना चाहते है, तो टुकड़ों में बांटा है, और भरवां एक UUID में:

uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'screwdriver'); 
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'toothbrush'); 
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'broomstick'); 
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'orange'); 
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'axe handle'); 
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'impulse body spray'); 
uuid = NameToUUID('8e884ace-bee4-11e4-8dfc-aa07a5b093db', 'iPod Touch'); 

नोट: किसी भी कोड सार्वजनिक डोमेन में जारी किया। कोई विशेषता आवश्यक है।

+15

पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। अगर मैं 'नेमस्पेस_रेक्टालॉर्निइन एक्स्ट्रेक्टेड ऑब्जेक्ट 'के लिए बोनस प्वाइंट दे सकता हूं तो मैं चाहता हूं। – boodle

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