Je viens d'écrire ce code pour convertir un GUID en un tableau d'octets. Quelqu'un peut-il percer des trous ou suggérer quelque chose de mieux?
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
};
}
En C++, je me souviens d’être capable de faire cela, mais j’imagine qu’il n’ya aucun moyen de le faire en Java avec la gestion de la mémoire et tout ?:
UUID uuid = UUID.randomUUID();
long[] longArray = new long[2];
longArray[0] = uuid.getMostSignificantBits();
longArray[1] = uuid.getLeastSignificantBits();
byte[] byteArray = (byte[])longArray;
return byteArray;
Si vous souhaitez générer un UUID complètement aléatoire sous forme d'octets qui ne sont conformes à aucun des types officiels, cela fonctionnera et gaspillera 10 bits de moins que les UUID de type 4 générés par UUID.randomUUID ():
public static byte[] getUuidAsBytes(){
int size = 16;
byte[] bytes = new byte[size];
new Random().nextBytes(bytes);
return bytes;
}
Je compte sur les fonctionnalités intégrées:
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
return bb.array();
ou quelque chose comme,
ByteArrayOutputStream ba = new ByteArrayOutputStream(16);
DataOutputStream da = new DataOutputStream(ba);
da.writeLong(uuid.getMostSignificantBits());
da.writeLong(uuid.getLeastSignificantBits());
return ba.toByteArray();
(Remarque, code non testé!)
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();
}
Vous pouvez vérifier UUID
depuis Apache-commons. Vous ne voulez peut-être pas l'utiliser, mais vérifiez dans sources pour voir comment sa méthode getRawBytes()
est implémentée:
public UUID(long mostSignificant, long leastSignificant) {
rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
}
Vous pouvez consulter Apache Commons Lang3 Conversion.uuidToByteArray (...) . Inversement, regardez Conversion.byteArrayToUuid (...) pour reconvertir en UUID.