我需要生成一些永远不会重复的int值(至少在理论上)。我知道有arc4random()fnc,但我不知道如何使用它与当前日期或smth :(
答案 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的内容,每次调用此功能时都是独一无二的,即使在多个设备和位置也是如此。
答案 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也很好。