2013-07-27 6 views
14

मैं UUID परिवर्तित कर रहा हूँ अगर मैं इस समारोह का उपयोग कर UUID पुन: बनाने की कोशिश करते हैं इस कोडपरिवर्तित UUID, कि जब UUID.nameUUIDFromBytes का उपयोग कर (ख)

public byte[] getIdAsByte(UUID uuid) 
{ 
    ByteBuffer bb = ByteBuffer.wrap(new byte[16]); 
    bb.putLong(uuid.getMostSignificantBits()); 
    bb.putLong(uuid.getLeastSignificantBits()); 
    return bb.array(); 
} 

का उपयोग कर हालांकि, बाइट के लिए, काम करता है

public UUID frombyte(byte[] b) 
{ 
    return UUID.nameUUIDFromBytes(b); 
} 

यह एक ही यूयूआईडी नहीं है। एक randomUUID को पीछे और पीछे कनवर्ट करना दो अलग-अलग देता है।

UUID u = UUID.randomUUID(); 
System.out.println(u.toString()); 
System.out.println(frombyte(getIdAsByte(u)).toString()); 

प्रिंट:

1ae004cf-0f48-469f-8a94-01339afaec41 
8b5d1a71-a4a0-3b46-bec3-13ab9ab12e8e 
+0

संबंधित, संभव डुप्लिकेट: [? क्या नाम स्थान JDK उपयोग nameUUIDFromBytes के साथ एक UUID उत्पन्न करने के लिए करता है] (http://stackoverflow.com/questions/9504519/what-namespace-does -the-jdk-use-to-gener-a-uuid-with-nameuuidfrombytes) –

उत्तर

35
public class UuidUtils { 
    public static UUID asUuid(byte[] bytes) { 
    ByteBuffer bb = ByteBuffer.wrap(bytes); 
    long firstLong = bb.getLong(); 
    long secondLong = bb.getLong(); 
    return new UUID(firstLong, secondLong); 
    } 

    public static byte[] asBytes(UUID uuid) { 
    ByteBuffer bb = ByteBuffer.wrap(new byte[16]); 
    bb.putLong(uuid.getMostSignificantBits()); 
    bb.putLong(uuid.getLeastSignificantBits()); 
    return bb.array(); 
    } 
} 

@Test 
public void verifyUUIDBytesCanBeReconstructedBackToOriginalUUID() { 
    UUID u = UUID.randomUUID(); 
    byte[] uBytes = UuidUtils.asBytes(u); 
    UUID u2 = UuidUtils.asUuid(uBytes); 
    Assert.assertEquals(u, u2); 
} 

@Test 
public void verifyNameUUIDFromBytesMethodDoesNotRecreateOriginalUUID() { 
    UUID u = UUID.randomUUID(); 
    byte[] uBytes = UuidUtils.asBytes(u); 
    UUID u2 = UUID.nameUUIDFromBytes(uBytes); 
    Assert.assertNotEquals(u, u2); 
} 
+0

इसका तात्पर्य है कि सभी छोटे-छोटे प्रतिनिधित्व पर सहमत हैं। –

+0

आपके पास पहली बार क्यों होगा == सेकंड एक ही गणना के साथ दो बार? यह पैरामीटर बाइट प्रतिनिधित्व में कम से कम/सबसे महत्वपूर्ण बिट्स माना जाता है। कोई राय? – belka

17

कि है, क्योंकि nameUUIDFromBytes UUID का एक विशिष्ट प्रकार का निर्माण (जावाडोक राज्यों के रूप में)।

यदि आप एक बाइट [] वापस यूयूआईडी में कनवर्ट करना चाहते हैं, तो आपको यूयूआईडी कन्स्ट्रक्टर का उपयोग करना चाहिए। बाइट के चारों ओर एक बाइटबफर लपेटें [], 2 लंबे समय तक पढ़ें और उन्हें यूयूआईडी कन्स्ट्रक्टर में पास करें।

+4

इसके लिए एक उदाहरण कोड होगा: 'बाइटबफर बीबी = बाइटबफर.प्रैप (इनपुटबाइटएरे); लंबे पहले लंबे = bb.getLong(); लंबा दूसरा लांग = bb.getLong(); नई यूयूआईडी (पहली बार, दूसरा लांग) लौटाएं; ' – djvdorp

+0

क्या होगा यदि यूयूआईडी नियंत्रक तक पहुंच Minecraft में प्रतिबंधित है? मुझे यह समस्या है क्योंकि मैं एक बुकीकिट सर्वर के लिए प्लगइन की दुकान विशेषता बनाने के लिए एक बड़ी फ़ाइल में बाइट्स को यूयूआईडी और कुछ डेटा को बाध्य करने की कोशिश कर रहा हूं। फ़ाइल सरणी में बाइनरी है: [0] यूयूआईडी [1] पैसा [2] अंक। यह सिर्फ फाइल में सूची नीचे जा रहा है दोहराएगा। –

+2

@LinkTheProgrammer - यदि आपके पास कोई अलग समस्या है, तो आपको शायद एक नया प्रश्न खोलना चाहिए। – jtahlborn

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