Acabo de escribir este código para convertir un GUID en una matriz de bytes. ¿Alguien puede disparar a cualquier orificios o sugerir algo mejor?

 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++, recuerdo que para poder hacer esto, pero supongo que no hay manera de hacerlo en Java con la gestión de la memoria y de todos?:

    UUID uuid = UUID.randomUUID();

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

    byte[] byteArray = (byte[])longArray;
    return byteArray;

Editar

Si quieres generar un completamente al azar UUID como el número de bytes que no se ajusta a ninguno de los oficiales de tipos, esto va a funcionar y desechos 10 menos bits de tipo 4 Uuid generado por UUID.randomUUID():

    public static byte[] getUuidAsBytes(){
    int size = 16;
    byte[] bytes = new byte[size];
    new Random().nextBytes(bytes);
    return bytes;
}
InformationsquelleAutor Chris Dutrow | 2010-06-06

4 Comentarios

  1. 64

    Aprovecharé construido en la funcionalidad:

    ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
    bb.putLong(uuid.getMostSignificantBits());
    bb.putLong(uuid.getLeastSignificantBits());
    return bb.array();

    o algo por el estilo,

    ByteArrayOutputStream ba = new ByteArrayOutputStream(16);
    DataOutputStream da = new DataOutputStream(ba);
    da.writeLong(uuid.getMostSignificantBits());
    da.writeLong(uuid.getLeastSignificantBits());
    return ba.toByteArray();

    (Nota, código no probado!)

    • No da el mismo UUID cuando llamo UUID.nameUUIDFromBytes(bb.array());
    • lo que se espera, nameUUIDFromBytes toma un hash a partir de los bytes que se le pasa. para deserializar el formato anterior de leer el suspira de nuevo y utilizar el constructor UUID(mucho,mucho)
  2. 13
    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();
    }
  3. 4

    Puede comprobar UUID de apache commons. Puede que no desee utilizar, pero el cheque de la fuentes para ver cómo su getRawBytes() método se implementa:

    public UUID(long mostSignificant, long leastSignificant) {
        rawBytes = Bytes.append(Bytes.toBytes(mostSignificant), Bytes.toBytes(leastSignificant));
    }
    • lo siento por comentar en el anterior post. pero, ¿por qué no usar este : uuid.toString().getBytes()
    • y cómo se debe convertir el byte[] para mostSignificat y leastSignificatnt con el fin de regenerar el original uuid?
    • uuid.toString().getBytes() construye un byte[] que contiene la representación de bytes de la predeterminada del sistema de la cadena de codificación de la representación textual de los UUID. Así que, probablemente, el UTF-8 bytes que representan una cadena como 37B4C0FB-6BEB-4EEF-8D4F-5552C3C76952. De 36 bytes de largo. Por otro lado, la propuesta de solución es sólo dos longs, o de 128 bits (16 bytes. Así, el 44% del espacio.

Dejar respuesta

Please enter your comment!
Please enter your name here