GUID для ByteArray - PullRequest
       12

GUID для ByteArray

26 голосов
/ 06 июня 2010

Я только что написал этот код для преобразования 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 в виде байтов, который не соответствует ни одному из официальных типов, это сработает и потратит 10 меньше битов , чем UUID типа 4, сгенерированные UUID.randomUUID () :

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

Ответы [ 4 ]

64 голосов
/ 06 июня 2010

Я бы положился на встроенную функциональность:

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

(Примечание, непроверенный код!)

13 голосов
/ 17 марта 2015
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();
}
4 голосов
/ 06 июня 2010

Вы можете проверить UUID из Apache-Commons. Возможно, вы не захотите его использовать, но проверьте sources , чтобы увидеть, как реализован его метод getRawBytes():

public UUID(long mostSignificant, long leastSignificant) {
    rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
}
0 голосов
/ 10 июля 2017

Вы можете взглянуть на Apache Commons Lang3 Conversion.uuidToByteArray (...) . И наоборот, посмотрите на Conversion.byteArrayToUuid (...) для преобразования обратно в UUID.

...