有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

字节数组的java GUID

我写这段代码是为了将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生成的类型4 UUID更有效,并且浪费10 fewer bits。randomUUID():

    public static byte[] getUuidAsBytes(){
    int size = 16;
    byte[] bytes = new byte[size];
    new Random().nextBytes(bytes);
    return bytes;
}

共 (4) 个答案

  1. # 2 楼答案

    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();
    }
    
  2. # 3 楼答案

    我将依赖于内置功能:

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

    (注意,未测试的代码!)

  3. # 4 楼答案

    您可以从apache commons中检查^{}。您可能不想使用它,但请检查sources以了解其getRawBytes()方法是如何实现的:

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