如何生成唯一标识符?

时间:2011-08-10 19:06:19

标签: iphone objective-c uniqueidentifier

我需要生成一些永远不会重复的int值(至少在理论上)。我知道有arc4random()fnc,但我不知道如何使用它与当前日期或smth :(

9 个答案:

答案 0 :(得分:54)

这将返回一个与MySQL中生成的UUID非常相似的唯一键。

+ (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;
}

答案 1 :(得分:37)

生成UUID(iOS 6或更高版本)的简单版本。

目标-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

答案 2 :(得分:3)

如果您使用核心数据来保存已玩游戏,NSManagedObject的{​​{1}}应该可以满足您的目的而不需要额外的努力。

答案 3 :(得分:2)

您可以使用以毫秒为单位的时间或更高级的方式GUID

答案 4 :(得分:2)

您可以创建一个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];

答案 5 :(得分:2)

一个简单的时间戳(毫秒* 10)应该可以解决这个问题:

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

答案 6 :(得分:1)

你没有说它必须是随机的。那么为什么不从一些数字开始,然后只将1加到你生成的最后一个数字上。

此方法应该至少为您提供40亿个唯一数字:

-(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;
}

答案 7 :(得分:1)

如果您有NSDictionary,则可以从最后一项生成渐进式ID:

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];

答案 8 :(得分:0)

您必须小心,特别是如果您使用1个例程的增量,如果您的应用程序被删除并重新加载到iDevice上,那么您将不再拥有已保存的默认号码。它将从头开始。如果您要存储用户的分数,您可能也希望保存其最高分数。最好在特定日期之后检查几秒(或毫秒)的时间例程。如果您需要这种独特性,上面提到的GUID也很好。