Search code examples
javauuid

convert uuid to byte, that works when using UUID.nameUUIDFromBytes(b)


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

Solution

  • 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);
    }