Подтвердить что ты не робот

Как создать уникальный идентификатор?

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

4b9b3361

Ответ 1

Это возвращает уникальный ключ, очень похожий на 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;
}

Ответ 2

Простая версия для генерации 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

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

Ответ 4

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

Ответ 5

Вы можете создать категорию 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];

Ответ 6

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

self.uid = [NSNumber numberWithInteger:[NSDate timeIntervalSinceReferenceDate] * 10000];

Ответ 7

Вы не сказали, что это должно быть случайным. Итак, почему бы не начать с некоторого числа, а затем просто добавить к 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;
}

Ответ 8

Если у вас есть 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];

Ответ 9

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