Есть ли способ для генерации стандартного 128-битного GUID (UUID) на Mac?

Есть ли встроенная функция, эквивалентная.NET

Guid.NewGuid();

в какао?

Мое желание состоит в том, чтобы произвести строку в соответствии с 550e8400-e29b-41d4-a716-446655440000 который представляет уникальный идентификатор.

8 ответов

Решение

UUID обрабатываются в Core Foundation библиотекой CFUUID. Функция, которую вы ищете - CFUUIDCreate.

К сведению: для дальнейших поисков: они чаще всего известны как UUID, термин GUID не очень часто используется за пределами мира Microsoft. Возможно, вам больше повезет с этим поисковым термином.

По крайней мере, в MacOSX 10.5.x вы можете использовать инструмент командной строки "uuidgen", чтобы получить вашу строку, например

$ uuidgen

054209C4-3873-4679-8104-3C18AE780512

есть также опция -hdr с этой командой, которая удобно генерирует ее в стиле заголовка

Смотрите man-страницу для получения дополнительной информации.

Некоторый код:

Для строкового UUID следующий метод класса должен сделать свое дело:

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

если вы действительно хотите байты (не строку):

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

где CFUUIDBytes - это структура байтов UUID.

Или есть uuidgen инструмент командной строки.

Начиная с 10.8 вы также можете использовать: NSString *uuidString = [[NSUUID UUID] UUIDString];

Вы можете создать псевдоним в ~/.bash_profileи позвони uuidиз терминала:

      alias uuid="uuidgen | tr '[:upper:]' '[:lower:]'"

Ознакомьтесь со статьей Википедии и страницей Core Foundation.

С 10.3 или около того, вы можете использовать [[NSProcessInfo processInfo] globallyUniqueString], Однако, хотя в настоящее время это генерирует UUID, это никогда не было и не гарантируется, поэтому, если вам действительно нужен UUID, а не просто какая-либо уникальная строка, вам следует использовать CFUUID.

Другие вопросы по тегам