2008-10-29 25 views

Respuesta

562

GUID es la implementación de Microsoft del estándar UUID.

por Wikipedia:

El término GUID general se refiere a la aplicación de la norma Universally Unique Identifier (UUID) de Microsoft.

Una cotización actualizada de ese mismo artículo de Wikipedia:

RFC 4122 sí establece que los UUID "también se conocen como GUID". Todo esto sugiere que "GUID", aunque originalmente se refería a una variante del UUID utilizado por Microsoft, se ha convertido simplemente en un nombre alternativo para UUID ...

+27

(The G significa Globally) –

+398

Al igual que Microsoft para tomar algo que funciona en todas partes (el universo) y hacer que funcione en un subconjunto muy pequeño (el globo) :) – Gus

+27

Tenga en cuenta que si desea convertir de la representación binaria GUID de Microsoft Para un UUID estándar, deberá voltear la endianidad de los primeros tres (de cuatro) campos de datos como se detalla en la sección "Codificación binaria" aquí: http://en.wikipedia.org/wiki/Globally_unique_identifier – Form

13

Realmente no. GUID está más centrado en Microsoft, mientras que UUID se usa más ampliamente (por ejemplo, como en el esquema URN urn: uuid:, y en CORBA).

632

La respuesta simple es: sin diferencia, son lo mismo. Trátelos como un valor de 16 bytes (128 bits) que se utiliza como un valor único. En Microsoft-talk, se llaman GUID, pero los llaman UUID cuando no usan Microsoft-speak.

Incluso los autores de la especificación UUID y reclamo Microsoft son sinónimos:

  • Desde la introducción de IETF RFC 4122 "un identificador único universal (UUID) urna de nombre": "un Uniform Resource Name espacio de nombres para UUID (universalmente IDentifier único), también conocido como GUID (Globally Unique IDentifier). "

  • del ITU-T Recommendation X.667, ISO/IEC 9834-8:2004 International Standard: "Los UUID también se conocen como Identificadores únicos globales (GUID), pero este término no se utiliza en esta Recomendación".

  • Y Microsoft incluso claims se especifica un GUID por el RFC UUID: "En la programación de Microsoft Windows y en los sistemas Windows, un identificador único global (GUID), como se especifica en [RFC4122] operativo, es ... El término el identificador único universal (UUID) a veces se usa en las especificaciones del protocolo de Windows como sinónimo de GUID ".

Pero la respuesta correcta depende de lo que significa la pregunta cuando dice "UUID" ...

La primera parte depende de lo que el autor de la pregunta está pensando cuando ellos están diciendo "UUID".

La afirmación de Microsoft implica que todos los UUID son GUID. Pero, ¿todos los GUID son UUID reales? Es decir, ¿el conjunto de todos los UUID es solo un subconjunto propio del conjunto de todos los GUID, o es exactamente el mismo conjunto?

Al observar los detalles del RFC 4122, hay cuatro "variantes" diferentes de UUID.Esto se debe principalmente a que tales identificadores de 16 bytes estaban en uso antes de que esas especificaciones se combinaran en la creación de una especificación UUID. De la sección 4.1.1 de RFC 4122, los cuatro variantes de UUID son:

  1. Reservado, Sistema de Computación de red compatibles hacia atrás
  2. La variante se especifica en RFC 4122 (de los cuales hay cinco sub-variantes , que se llaman "versiones")
  3. Reservado, compatibilidad hacia atrás de Microsoft Corporation
  4. Reservado para una definición futura.

De acuerdo con RFC 4122, todas las variantes UUID son "reales" UUID, a continuación, todos los GUID son UUID reales. A la pregunta literal "¿hay alguna diferencia entre GUID y UUID?" La respuesta es definitivamente no para RFC 4122 UUID: sin diferencia (pero sujeto a la segunda parte a continuación).

Pero no todos los GUID son variante 2 UUID (por ejemplo, Microsoft COM tiene GUID que son variante 3 UUID). Si la pregunta era "¿hay alguna diferencia entre el GUID y la variante 2 UUID", entonces la respuesta sería sí, pueden ser diferentes. Alguien que hace la pregunta probablemente no sabe acerca de las variantes y podría estar pensando en variante 2 UUID cuando dicen la palabra "UUID" (p. Ej., Conocen vagamente la dirección MAC + tiempo y los algoritmos de números aleatorios formularios de UUID, que son versiones de variante 2). En cuyo caso, la respuesta es sí diferente.

De modo que la respuesta, en parte, depende de lo que la persona que pregunta piensa cuando dice la palabra "UUID". ¿Significan variante 2 UUID (porque esa es la única variante que conocen) o todos los UUID?

La segunda parte depende de qué especificación se utilice como definición de UUID.

Si cree que fue confuso, lea ITU-T X.667 ISO/IEC 9834-8:2004 que se supone que debe alinearse y es técnicamente compatible con RFC 4122. Tiene una oración adicional en la cláusula 11.2 que dice: "Todos los UUID que se ajusten a esta Recomendación | Estándar internacional tendrán bits de variantes con el bit 7 del octeto 7 en 1 y el bit 6 del octeto 7 en 0". Lo que significa que solo variante 2 UUID se ajustan a ese estándar (esos dos valores de bit significan variante 2). Si eso es cierto, entonces no todos los GUID conforman los UUID de ITU-T/ISO/IEC, porque los UUID de ITU-T/ISO/IEC conformes solo pueden ser variante 2 valores.

Por lo tanto, la respuesta real también depende de qué especificación del UUID se esté preguntando. Suponiendo que estamos hablando claramente de todos los UUID y no sólo la variante 2 UUID: no existe ninguna diferencia entre GUID y UUID del IETF, pero diferencia entre sí GUID y UUID conforme UIT-T/ISO/IEC de!

codificaciones binarias podrían diferir

Cuando codificado en binario (en contraposición con el formato de texto legible), el GUID may be stored en una estructura con cuatro campos diferentes como sigue. Este formato difiere del UUID standard solo en el orden de bytes de los primeros 3 campos.

Bits Bytes Name Endianness Endianness 
        (GUID)  RFC 4122 

32 4  Data1 Native  Big 
16 2  Data2 Native  Big 
16 2  Data3 Native  Big 
64 8  Data4 Big   Big 
+26

Más informativo que la respuesta elegida. Creo que la respuesta elegida es la respuesta más simple a la pregunta, sin embargo. –

+2

La tabla de codificación binaria incrustada en la respuesta es muy útil. Tnx – Luciano

+1

El 'endianness' es muy importante. Si almacena la identificación como bytes obtendrá diferentes resultados de GUID y UUID. – Calabacin

6

GUID tiene un uso de larga data en las zonas en las que no es necesariamente un valor de 128 bits en la misma forma que un UUID. Por ejemplo, el RSS specification defines GUIDs puede ser cualquier cadena de su elección, siempre que sea única, con un atributo "isPermalink" para especificar que el valor que está utilizando es solo un enlace permanente al elemento que se distribuye.

8

escribí un método para convertir la matriz de bytes GUID en UUID en Java, creo que sirve:

public static UUID fromGuidByteArrayToUUID(byte[] blob) { 
    if(blob != null && blob.length == 16) { 
     ByteBuffer b1_4bytes = ByteBuffer.wrap(subByteArray(blob, 0, 4)); 
     b1_4bytes.order(ByteOrder.LITTLE_ENDIAN); 
     ByteBuffer b2_2bytes = ByteBuffer.wrap(subByteArray(blob, 4, 2)); 
     b2_2bytes.order(ByteOrder.LITTLE_ENDIAN); 
     ByteBuffer b3_2bytes = ByteBuffer.wrap(subByteArray(blob, 6, 2)); 
     b3_2bytes.order(ByteOrder.LITTLE_ENDIAN); 
     ByteBuffer b4_8bytes = ByteBuffer.wrap(subByteArray(blob, 8, 8)); 
     b4_8bytes.order(ByteOrder.BIG_ENDIAN); 
     ByteBuffer bb = ByteBuffer.allocate(16); 

     bb.putInt(b1_4bytes.getInt()); 
     bb.putShort(b2_2bytes.getShort()); 
     bb.putShort(b3_2bytes.getShort()); 
     bb.putLong(b4_8bytes.getLong()); 

     bb.position(0); 

     long firstLong = bb.getLong(); 
     long secondLong = bb.getLong(); 
     UUID uuid = new UUID(firstLong, secondLong);   
     return uuid; 
    }else { 
     return null; 
    } 
} 
5

Mi aplicación para convertir de orden de bytes UUID de Java para de GUID

/** 
* Fix for endian differences between UUID and GUIDS 
* 
* @param uuid 
* @return 
*/ 
protected static byte[] UuidToGuidByteArray(UUID uuid) 
{ 
    ByteBuffer bb = ByteBuffer.wrap(new byte[16]); 
    bb.putLong(uuid.getMostSignificantBits()); 
    bb.putLong(uuid.getLeastSignificantBits()); 

    byte[] out = bb.array(); 
    byte swap; 

    //swap first 4 
    swap = out[0]; 
    out[0] = out[3]; 
    out[3] = swap; 

    swap = out[1]; 
    out[1] = out[2]; 
    out[2] = swap; 

    //swap next 2 
    swap = out[4]; 
    out[4] = out[5]; 
    out[5] = swap; 

    //swap next 2 
    swap = out[6]; 
    out[6] = out[7]; 
    out[7] = swap; 

    return out; 
} 
2

Microsoft de guid puede estar en la forma de un uuid estando rodeado por dos llaves. {} ...

Cuestiones relacionadas