GUID к ByteArray

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

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

26
задан Chris Dutrow 7 June 2010 в 16:12
поделиться

2 ответа

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

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

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

64
ответ дан 28 November 2019 в 06:15
поделиться

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

public UUID(long mostSignificant, long leastSignificant) {
    rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
}
4
ответ дан 28 November 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: