Как сгенерировать уникальный идентификатор? - PullRequest
22 голосов
/ 10 августа 2011

Мне нужно сгенерировать некоторое значение типа int, которое никогда не повторится (по крайней мере, теоретически).Я знаю, что есть arc4random () fnc, но я не уверен, как использовать его с какой-либо текущей датой или чем-то вроде :(

Ответы [ 9 ]

54 голосов
/ 11 августа 2011

Возвращает уникальный ключ, очень похожий на UUID, сгенерированный в MySQL.

+ (NSString *)uuid
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    return [(NSString *)uuidStringRef autorelease];
}

ARC версия:

+ (NSString *)uuid
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    return (__bridge_transfer NSString *)uuidStringRef;
}
37 голосов
/ 15 июля 2014

Простая версия для генерации UUID (iOS 6 или более поздняя версия).

Objective-C:

NSString *UUID = [[NSUUID UUID] UUIDString];

Swift 3 +:

let uuid = UUID().uuidString

Это будетсгенерируйте что-то вроде 68753A44-4D6F-1226-9C60-0050E4C00067, которое уникально при каждом вызове этой функции, даже для нескольких устройств и мест.

Ссылка: https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSUUID_Class/Reference/Reference.html

3 голосов
/ 11 августа 2011

Если вы используете CoreData для сохранения сыгранных игр, NSManagedObject objectID должно служить вашей цели без каких-либо дополнительных усилий.

2 голосов
/ 20 ноября 2013

Простая отметка времени (миллисекунды * 10) должна помочь:

self.uid = [NSNumber numberWithInteger:[NSDate timeIntervalSinceReferenceDate] * 10000];
2 голосов
/ 05 апреля 2013

Вы можете создать категорию UIApplication, UIDevice или, как вы предпочитаете, как это (пример ARC)

@interface UIApplication (utilities)
- (NSString*)getUUID;
@end

@implementation UIApplication (utilities)

- (NSString*)getUUID {

    NSUserDefaults *standardUserDefault = [NSUserDefaults standardUserDefaults];

    static NSString *uuid = nil;

    // try to get the NSUserDefault identifier if exist
    if (uuid == nil) {

        uuid = [standardUserDefault objectForKey:@"UniversalUniqueIdentifier"];
    }

    // if there is not NSUserDefault identifier generate one and store it
    if (uuid == nil) {

        uuid = UUID ();
        [standardUserDefault setObject:uuid forKey:@"UniversalUniqueIdentifier"];
        [standardUserDefault synchronize];
    }

    return uuid;
}

@end

UUID () - это функция

NSString* UUID () {

    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    return (__bridge NSString *)uuidStringRef;
}

это генерирует уникальный идентификатор, сохраняемый в NSUserDefault для повторного использования всякий раз, когда приложению это необходимо - этот идентификатор будет уникальным, связанным с установкой приложения, а не с устройством, но его можно использовать, например, для отслеживания количества устройств, подписанных на Сервис APN и т.д ...

После этого вы можете использовать его следующим образом:

    NSString *uuid = [[UIApplication sharedApplication] getUUID];
2 голосов
/ 10 августа 2011

Вы можете использовать время в миллисекундах или более сложным способом GUID .

1 голос
/ 14 июля 2014

Если у вас есть NSDictionary, вы можете сгенерировать прогрессивный идентификатор из последнего элемента:

NSInteger maxKey = -1;
for(NSString *key in [YOUR_DICTIONARY allKeys])
{
    NSInteger intKey = [key integerValue];
    if(intKey > maxKey)
    {
        maxKey = intKey;
    }
}
NSString *newKey = [NSString stringWithFormat:@"%d", maxKey + 1];
1 голос
/ 10 августа 2011

Вы не сказали, что это должно быть случайно. Так почему бы не начать с некоторого числа, а затем просто добавить 1 к последнему сгенерированному номеру.

Этот метод должен дать вам не менее 4 миллиардов уникальных чисел для начала:

-(NSInteger)nextIdentifies;
{
    static NSString* lastID = @"lastID";
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    NSInteger identifier = [defaults integerForKey:lastID] + 1;
    [defaults setInteger:identifier forKey:lastID];
    [defaults synchronize];
    return identifier;
}
0 голосов
/ 11 августа 2011

Вы должны быть осторожны, особенно если вы используете процедуры увеличения на 1, что если ваше приложение будет удалено и загружено на iDevice, у вас больше не будет сохраненного номера по умолчанию. Это начнется сначала. Если вы храните баллы пользователей, вы также можете сохранить их наибольшее количество. Лучше проверять подпрограммы времени на секунды (или миллисекунды) после определенной даты. Упомянутый выше GUID тоже хорош, если вам нужна такая уникальность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...