web-dev-qa-db-ja.com

一意の識別子を生成するには?

(少なくとも理論的には)繰り返されないint値を生成する必要があります。私はarc4random()fncがあることを知っていますが、現在の日付またはsmthでそれを使用する方法がわかりません:(

22
Centurion

これは、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;
}
54
Nandakumar R

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

37
MaikonFarias

Core Dataを使用してプレイしたゲームを保存している場合、NSManagedObjectobjectIDは余分な労力なしで目的を果たすはずです。

3
Akshay

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
Manu

単純なタイムスタンプ(ミリ秒* 10)でうまくいくはずです。

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

ミリ秒単位の時間またはより高度な方法 [〜#〜] guid [〜#〜] を使用できます。

2
Justin

あなたはそれがランダムである必要があるとは言いませんでした。では、いくつかの数値から始めて、最後に生成した数値に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;
}
1
PeyloW

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

特に1ずつ増加するルーチンを使用する場合、アプリが削除されてiDeviceに再ロードされると、保存されているデフォルトの番号がなくなることに注意する必要があります。最初からやり直します。ユーザーのスコアを保存している場合は、ユーザーの最大数も保存することをお勧めします。特定の日付の後の秒(またはミリ秒)の時間ルーチンをチェックすることをお勧めします。上記のGUIDは、そのような一意性が必要な場合にも適しています。

0
Owen Hartnett