2008-11-15 11 views
20

¿Existe un sistema incorporado en función equivalente a .NET de¿Existe algún método para generar un GUID estándar de 128 bits (UUID) en la Mac?

Guid.NewGuid(); 

en Cocoa?

Mi deseo es producir una cadena a lo largo de las líneas de 550e8400-e29b-41d4-a716-446655440000 que representa un identificador único.

+5

En lugar de preguntar "¿existe una función equivalente a foo()", debe explicar de qué se trata la función sobre la que pregunta. Mac OS X no tiene objetos "Guid", tiene CFUUIDRef. Los desarrolladores de Mac de larga data quizás no conozcan un "Guid" de un agujero en el suelo. –

Respuesta

42

Los UUID se manejan en Core Foundation, por la biblioteca CFUUID. La función que está buscando es CFUUIDCreate.

FYI para búsquedas adicionales: estos son más comúnmente conocidos como UUID, el término GUID no se usa muy a menudo fuera del mundo de Microsoft. Es posible que tenga más suerte con ese término de búsqueda.

11

o está la herramienta de línea de comandos uuidgen.

+5

Aparentemente esa utilidad ha sido renombrada 'uuidgen'. Al menos, como de Snow Leopard. – VxJasonxV

+0

¡Gracias! Acabo de actualizarlo de 'genuuid' a' uuidgen'. – ma11hew28

2

Desde 10.3 o menos, puede usar [[NSProcessInfo processInfo] globallyUniqueString]. Sin embargo, aunque este actualmente genera un UUID, nunca ha sido ni se garantiza que lo haga, por lo que si realmente necesita un UUID y no solo una cadena única, debe usar CFUUID.

32

Algunos código:

Para un UUID cadena, el siguiente método de la clase debe hacer el truco:

+(NSString*)UUIDString { 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFStringRef string = CFUUIDCreateString(NULL, theUUID); 
    CFRelease(theUUID); 
    return [(NSString *)string autorelease]; 
} 

si realmente quieren los bytes (no la cadena):

+(CFUUIDBytes)UUIDBytes { 
    CFUUIDRef theUUID = CFUUIDCreate(NULL); 
    CFUUIDBytes bytes = CFUUIDGetUUIDBytes(theUUID); 
    CFRelease(theUUID); 
    return bytes; 
} 

donde CFUUIDBytes es struct de los bytes UUID.

+0

@Jay: Técnicamente, esa es la API de Core Foundation, que está escrita en C. Cocoa está escrita en Objective C y es mucho más concisa (la mayoría de las veces). – geon

+1

Consulte la respuesta de David a continuación (http://stackoverflow.com/a/22093094/1172352) para obtener una forma más sencilla de hacerlo en 10.8+, simplemente usando 'NSUUID'. – peterflynn

24

Al menos en MacOSX 10.5.x puede usar la herramienta de línea de comandos "uuidgen" para obtener su cadena , p.

$ uuidgen

054209C4-3873-4679-8104-3C18AE780512

también hay una opción -hdr con este comand que genera convenientemente en estilo de cabecera

Ver página de manual para más info .

+0

Esto todavía funciona a partir de Mac OS X 10.7 "Lion" –

+0

No es exactamente lo que OP quería, pero igual de útil (y Google me trajo aquí cuando buscaba la generación de UUID de línea de comandos en Macs). También: confirmado que todavía funciona en Mac OS X 10.9 "Mavericks" – chesterbr

8

Desde 10.8 también podría usar: NSString * uuidString = [[NSUUID UUID] UUIDString];

Cuestiones relacionadas