टाइप 3 और टाइप 5 यूयूआईडी केवल यूयूआईडी में हैश भरवाने की एक तकनीक है ।
- टाइप 1: सामान मैक एड्रेस + डेटाइम 128 बिट्स में
- टाइप 3 : एक एमडी 5 हैश को 128 बिट में भरता है
- टाइप 4: 128 बिट्स में रैंडम डेटा भरता है
- टाइप 5 : 128 बिट में एक SHA1 हैश भरता है
- टाइप 6: अनुक्रमिक यूयूआईडी के लिए अनौपचारिक विचार
एक 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 आरएफसी आप के लिए चार नामस्थान पहले से परिभाषित करता है:
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");
RFC तब परिभाषित करता है:
- SHA1 से 160 बिट लें
- और इसे UUID के 128 बिट में परिवर्तित करें
मूल जिस्ट केवल पहले 128 बिट्स लेने के लिए है, टाइप रिकॉर्ड 5
में एक सामान है , और फिर अनुभाग के पहले दो बिट्स को क्रमशः 1 और 0 पर सेट करें ।clock_seq_hi_and_reserved
और ज्यादा उदाहरण
अब जब आपके पास एक फ़ंक्शन है जो एक तथाकथित नाम उत्पन्न करता है , तो आपके पास फ़ंक्शन (छद्म कोड में) हो सकता है:
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;
}
(ध्यान दें कि आपके सिस्टम का एंडियन-नेस उपरोक्त बाइट्स के सूचकांक को प्रभावित कर सकता है)
आप कॉल कर सकते हैं:
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 को अतिरिक्त कमांड लाइन तर्क नाम स्थान और नाम देना होगा। नाम स्थान या तो स्ट्रिंग प्रतिनिधित्व में एक UUID है या आंतरिक रूप से पूर्व-निर्धारित नामस्थान UUIDs के लिए एक पहचानकर्ता है (वर्तमान में "ns: DNS", "ns: URL", "ns: OID", और "ns: X500")। नाम मनमानी लंबाई की एक स्ट्रिंग है।
नाम स्थान जो कुछ भी आप की तरह UUID है। यह पूर्व-परिभाषित लोगों में से एक हो सकता है, या आप अपना खुद का बना सकते हैं, जैसे:
UUID Namespace_RectalForeignExtractedObject = '8e884ace-bee4-11e4-8dfc-aa07a5b093db'
नाम मनमानी लंबाई की एक स्ट्रिंग है।
नाम सिर्फ वह पाठ है जिसे आप नेमस्पेस में जोड़ा जाना चाहते हैं, फिर हैशेड और यूआईडी में भर दिया है:
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');
नोट : कोई भी कोड सार्वजनिक डोमेन में जारी किया गया। कोई एट्रिब्यूशन की आवश्यकता नहीं है।