将uuid转换为byte,在使用UUID.nameUUIDFromBytes(b)时有效

Ale*_*lay 22 java uuid

我正在使用此代码将UUID转换为byte

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

但是,如果我尝试使用此功能重新创建UUID,

public UUID frombyte(byte[] b)
{
    return UUID.nameUUIDFromBytes(b);
}
Run Code Online (Sandbox Code Playgroud)

它与UUID不同.前后转换randomUUID会返回两个不同的.

UUID u = UUID.randomUUID();
System.out.println(u.toString());
System.out.println(frombyte(getIdAsByte(u)).toString());
Run Code Online (Sandbox Code Playgroud)

打印:

1ae004cf-0f48-469f-8a94-01339afaec41
8b5d1a71-a4a0-3b46-bec3-13ab9ab12e8e
Run Code Online (Sandbox Code Playgroud)

Bri*_*ace 56

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();
  }
}
Run Code Online (Sandbox Code Playgroud)
@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);
}
Run Code Online (Sandbox Code Playgroud)

  • @Brice我不相信“使用基于x86(小端)的处理器”是相关的。[`ByteBuffer`](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/nio/ByteBuffer.html) 类具有独立的字节序和“_初始字节缓冲区的顺序始终是 BIG_ENDIAN_”。 (3认同)
  • 这意味着每个人都同意小端表示。 (2认同)

jta*_*orn 19

那是因为nameUUIDFromBytes构造了一种特定的UUID(如javadoc所述).

如果要将byte []转换回UUID,则应使用UUID构造函数.在byte []周围包装一个ByteBuffer,读取2个long并将它们传递给UUID构造函数.

  • 一个示例代码是:`ByteBuffer bb = ByteBuffer.wrap(inputByteArray); long firstLong = bb.getLong(); long secondLong = bb.getLong(); 返回新的UUID(firstLong,secondLong);` (4认同)
  • @LinkTheProgrammer - 如果你有不同的问题,那么你应该开一个新问题. (2认同)