2013-07-27 4 views
14

私はこの機能を使用してUUIDを再作成しようとした場合、私はコンバートUUID、(b)は

、しかし、このコード

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

を使用してバイトしてUUIDを変換しています

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

これは同じUUIDではありません。 randomUUIDを前後に変換すると、2つの異なる戻り値が返されます。

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

関連、可能性の重複:[?何のネームスペースnameUUIDFromBytesとUUIDを生成するために、JDKの使用を行います](http://stackoverflow.com/questions/9504519/what-namespace-does -the-jdk-use-to-auuid-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

なぜfirstLong == secondLongと同じ計算が2回ありますか?このパラメータは、バイト表現における最も重要でない/最も重要なビットであると考えられる。 意見はありますか? – belka

17

nameUUIDFromBytesは(Javadocの状態など)UUIDの特定の種類を構築するためです。

バイト[]をUUIDに変換する場合は、UUIDコンストラクタを使用する必要があります。 byte []の周囲にByteBufferをラップし、2つのlongを読み込み、それらをUUIDコンストラクタに渡します。

+4

これのコード例は次のようになります。 'ByteBuffer bb = ByteBuffer.wrap(inputByteArray); long firstLong = bb.getLong(); long secondLong = bb.getLong(); return新しいUUID(firstLong、secondLong); ' – djvdorp

+0

UUIDコンストラクタへのアクセスがminecraftのように制限されている場合はどうなりますか?私はこの問題を抱えています.BukitサーバーのPluginのShop特性を作成するために、UUIDといくつかのデータを1つの大きなファイルにまとめて圧縮しようとしているからです。ファイルは配列のバイナリ形式です:[0] UUID [1] money [2] points。これは、ファイル内のリストを繰り返していくだけです。 –

+2

@LinkTheProgrammer - 別の問題がある場合は、おそらく新しい質問を開くべきです。 – jtahlborn