Мне нужно сгенерировать некоторую значение int, которое никогда не повторится (по крайней мере теоретически). Я знаю, что есть arc4random() fnc, но я не уверен, как использовать его с текущей датой или smth:(
Как создать уникальный идентификатор?
Ответ 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, которое уникально каждый раз, когда вы вызываете эту функцию, даже в нескольких устройствах и локациях.
Ответ 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 тоже хорош, если вам нужна такая уникальность.