Reputation: 3073
I am converting UUID to byte using this code
public byte[] getIdAsByte(UUID uuid)
{
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
}
However, if I try to recreate the UUID using this function,
public UUID frombyte(byte[] b)
{
return UUID.nameUUIDFromBytes(b);
}
It is not the same UUID. Converting a randomUUID back and forth returns two different it.
UUID u = UUID.randomUUID();
System.out.println(u.toString());
System.out.println(frombyte(getIdAsByte(u)).toString());
prints:
1ae004cf-0f48-469f-8a94-01339afaec41
8b5d1a71-a4a0-3b46-bec3-13ab9ab12e8e
Upvotes: 40
Views: 53977
Reputation: 10650
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.allocate(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);
}
Upvotes: 87
Reputation: 53694
that's because nameUUIDFromBytes
constructs a specific kind of UUID (as the javadoc states).
if you want to convert a byte[] back to a UUID, you should use the UUID constructor. Wrap a ByteBuffer around the byte[], read the 2 longs and pass them to the UUID constructor.
Upvotes: 20