Java 字节数组的GUID

Java 字节数组的GUID,java,guid,bytearray,uuid,Java,Guid,Bytearray,Uuid,我写这段代码是为了将GUID转换成字节数组。有人能在上面打洞或提出更好的建议吗 public static byte[] getGuidAsByteArray(){ UUID uuid = UUID.randomUUID(); long longOne = uuid.getMostSignificantBits(); long longTwo = uuid.getLeastSignificantBits(); return new byte[] { (byte)(lon

我写这段代码是为了将GUID转换成字节数组。有人能在上面打洞或提出更好的建议吗

 public static byte[] getGuidAsByteArray(){

 UUID uuid = UUID.randomUUID();
 long longOne = uuid.getMostSignificantBits();
 long longTwo = uuid.getLeastSignificantBits();

 return new byte[] {
      (byte)(longOne >>> 56),
      (byte)(longOne >>> 48),
      (byte)(longOne >>> 40),
      (byte)(longOne >>> 32),   
      (byte)(longOne >>> 24),
      (byte)(longOne >>> 16),
      (byte)(longOne >>> 8),
      (byte) longOne,
      (byte)(longTwo >>> 56),
      (byte)(longTwo >>> 48),
      (byte)(longTwo >>> 40),
      (byte)(longTwo >>> 32),   
      (byte)(longTwo >>> 24),
      (byte)(longTwo >>> 16),
      (byte)(longTwo >>> 8),
      (byte) longTwo
       };
}
在C++中,我记得能够做到这一点,但我想在java中没有办法用内存管理和所有的:

    UUID uuid = UUID.randomUUID();

    long[] longArray = new long[2];
    longArray[0] = uuid.getMostSignificantBits();
    longArray[1] = uuid.getLeastSignificantBits();

    byte[] byteArray = (byte[])longArray;
    return byteArray;
编辑 如果您想要生成一个完全随机的UUID,作为不符合任何正式类型的字节,这将比UUID.randomUUID()生成的类型4 UUID更有效和浪费:


我将依赖于内置功能:

ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
或者类似的

ByteArrayOutputStream ba = new ByteArrayOutputStream(16);
DataOutputStream da = new DataOutputStream(ba);
da.writeLong(uuid.getMostSignificantBits());
da.writeLong(uuid.getLeastSignificantBits());
return ba.toByteArray();
(注意,未经测试的代码!)

您可以从apache commons进行检查。您可能不想使用它,但请检查以查看其
getRawBytes()
方法是如何实现的:

public UUID(long mostSignificant, long leastSignificant) {
    rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
}

您可以看看ApacheCommonsLang3。相反,请看,将它转换成uuID.< /p> Dupe?-不,我提到C++中,你可以跳过,把所有的东西复制到另一个数组中,但是它看起来不像你在java中那样做。当我调用uuID.NAMEUUIDFRONBASEL(BB.ARRAY())时,它的副本不可能给出相同的UUID。这是意料之中的,nameuidFromBytes从您传递给它的字节中获取一个散列。要反序列化上面的格式,请再次阅读long并使用构造函数UUID(long,long),抱歉对旧帖子进行评论。但是为什么不使用这个:uuid.toString().getBytes(),以及如何将字节[]转换为mostSignificate和leastSignificate,以便重新生成原始的uuid?
uuid.toString().getBytes()
构建一个字节[],其中包含系统默认字符串编码的字节表示形式以及uuid的文本表示形式。因此,可能是表示字符串的UTF-8字节,如
37B4C0FB-6BEB-4EEF-8D4F-5552C3C76952
。这是36字节长。另一方面,建议的解决方案只有两个
s,或128位,或16字节。所以,44%的空间。
public UUID(long mostSignificant, long leastSignificant) {
    rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
}
public static byte[] newUUID() {
    UUID uuid = UUID.randomUUID();
    long hi = uuid.getMostSignificantBits();
    long lo = uuid.getLeastSignificantBits();
    return ByteBuffer.allocate(16).putLong(hi).putLong(lo).array();
}