Java 将uuid转换为字节,这在使用uuid.NameUUIDRomBytes(b)时有效

Java 将uuid转换为字节,这在使用uuid.NameUUIDRomBytes(b)时有效,java,uuid,Java,Uuid,我正在使用此代码将UUID转换为字节 public byte[] getIdAsByte(UUID uuid) { ByteBuffer bb = ByteBuffer.wrap(new byte[16]); bb.putLong(uuid.getMostSignificantBits()); bb.putLong(uuid.getLeastSignificantBits()); return bb.array(); } 但是,如果我尝试使用此函数重新创建UUI

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

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。来回转换随机UUID会返回两个不同的结果

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

这是因为
nameuidfrombytes
构造了一种特定类型的UUID(如javadoc所述)

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

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


相关的,可能重复的:这方面的示例代码是:
ByteBuffer bb=ByteBuffer.wrap(inputByteArray);long firstLong=bb.getLong();long secondLong=bb.getLong();返回新的UUID(firstLong、secondLong)如果对UUID构造函数的访问像在minecraft中一样受到限制怎么办?我有这个问题,因为我试图将UUID和一些数据压缩到一个大文件中的字节,以创建bukkit服务器插件的商店特性。该文件是数组[0]UUID[1]货币[2]点数中的二进制文件。这将在文件中的列表中重复。@LinkTheProgrammer-如果您有不同的问题,那么您可能应该打开一个新问题。这意味着每个人都同意小端表示法。为什么要使用两次相同的计算使firstLong==secondLong?该参数应为字节表示中的最低/最高有效位。有什么意见吗?这是小endian吗?ByteBuffer本身将以一个大订单开始。是的。这是使用基于x86(little-endian)的处理器测试的。@Brice我不认为“使用基于x86(little-endian)的处理器”是相关的。该类具有独立的ENDIAN,并且“字节缓冲区的初始顺序始终是BIG_ENDIAN”。
@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);
}