टाइप 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');
नोट: किसी भी कोड सार्वजनिक डोमेन में जारी किया। कोई विशेषता आवश्यक है।
पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। अगर मैं 'नेमस्पेस_रेक्टालॉर्निइन एक्स्ट्रेक्टेड ऑब्जेक्ट 'के लिए बोनस प्वाइंट दे सकता हूं तो मैं चाहता हूं। – boodle