2012-02-29 13 views
12

सूर्य/ओरेकल जेडीके java.util पैकेज में एक प्रकार 3 (नाम आधारित) UUID बनाने के लिए एक फ़ंक्शन का खुलासा करता है: java.util.UUID.nameUUIDFromBytes (बाइट [] नाम)।नाम UUIDFromBytes के साथ यूयूआईडी उत्पन्न करने के लिए जेडीके किस नामस्थान का उपयोग करता है?

मुझे nameUUIDFromBytes का उपयोग करके जावा में एक प्रकार 3 यूयूआईडी उत्पन्न करने में सक्षम होना चाहिए और एक अन्य भाषा में एक प्रकार 3 यूयूआईडी बनाते समय उसी यूयूआईडी पर पहुंचने की आवश्यकता है, मानते हुए कि मैं स्रोत के समान बाइट प्रदान करता हूं।

javadocs के अनुसार यह फ़ंक्शन एक आरएफसी 4122 अनुपालन प्रकार 3 यूयूआईडी बनाता है। हालांकि, RFC 4122 spec के अनुसार, कुछ नामस्थान के भीतर एक प्रकार 3 यूयूआईडी बनाया जाना चाहिए। अन्य 3 भाषाओं में आप टाइप 3 यूयूआईडी (उदाहरण के लिए रुबी में UUIDTools gem) बनाते समय नामस्थान निर्दिष्ट करते हैं।

तो मेरा सवाल यह है कि जब मैं नाम UUIDFromBytes का आह्वान करता हूं तो जेडीके द्वारा किस नामस्थान यूयूआईडी का उपयोग किया जाता है?

+0

JDK आंतरिक MD5 एन्क्रिप्शन के लिए, का उपयोग करता है, हालांकि SHA-1 भी अनुमति दी है, और यहां तक ​​कि प्राथमिकता दी। तो उस विकल्प पर अकेले यूयूआईडी अलग हो सकते हैं। –

उत्तर

7

this bug report

देखें खास तौर पर टिप्पणी, तल के पास:

शायद कार्रवाई के पाठ्यक्रम इस बिंदु पर जावाडोक बताते हुए ठीक करने के लिए किया जाएगा "nameUUIDFromBytes (बाइट [] namespaceAndName)" एक नामस्थान यूयूआईडी के बाइट्स और नाम बाइट्स (उस क्रम में) के संयोजन को एक बाइट सरणी में पास करना चाहिए "यह केवल एमडी 5 के बाइट [] विधि को मान रहा है और आईईटीएफ दस्तावेज़ के अनुसार फ़ील्ड सेट करता है।

मुझे नहीं पता कि मैं सही तरीके से काम करने के लिए इस पर भरोसा करता हूं, लेकिन यूयूआईडी स्पेक से पूर्वनिर्धारित नामस्थानों का उपयोग करके परीक्षण करना आसान होना चाहिए, कुछ अन्य कार्यान्वयन द्वारा उत्पन्न यूयूआईडी की तुलना में।

+0

यह पूरी तरह से काम किया। धन्यवाद! –

+0

Wooohooo! पुष्टि करने के लिए धन्यवाद। – theglauber

1

एक नमूना कोड:

String NameSpace_OID_string = "6ba7b812-9dad-11d1-80b4-00c04fd430c8"; 
UUID NameSpace_OID_uuid = UUID.fromString(NameSpace_OID_string); 

long msb = NameSpace_OID_uuid.getMostSignificantBits(); 
long lsb = NameSpace_OID_uuid.getLeastSignificantBits(); 

    byte[] NameSpace_OID_buffer = new byte[16]; 

    for (int i = 0; i < 8; i++) { 
     NameSpace_OID_buffer[i] = (byte) (msb >>> 8 * (7 - i)); 
    } 
    for (int i = 8; i < 16; i++) { 
     NameSpace_OID_buffer[i] = (byte) (lsb >>> 8 * (7 - i)); 
    } 

    String name = "user123"; 
    byte[] name_buffer = name.getBytes(); 

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
try { 
    outputStream.write(NameSpace_OID_buffer); 
    outputStream.write(name_buffer); 
} catch (IOException e) { 
     // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 


byte byteArray[] = outputStream.toByteArray(); 

System.out.println(UUID.nameUUIDFromBytes(byteArray).toString()); 
संबंधित मुद्दे