web-dev-qa-db-fra.com

Comment générer un identifiant unique?

J'ai besoin de générer une valeur int qui ne se répète jamais (du moins théoriquement). Je sais qu'il existe arc4random () fnc, mais je ne sais pas comment l'utiliser avec une date ou un numéro en cours :(

22
Centurion

Cela retourne une clé unique très similaire à l'UUID générée dans MySQL.

+ (NSString *)uuid
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    return [(NSString *)uuidStringRef autorelease];
}

Version ARC:

+ (NSString *)uuid
{
    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    return (__bridge_transfer NSString *)uuidStringRef;
}
54
Nandakumar R

Une version simple pour générer un UUID (iOS 6 ou version ultérieure).

Objectif c:

NSString *UUID = [[NSUUID UUID] UUIDString];

Swift 3+:

let uuid = UUID().uuidString

Il générera quelque chose comme 68753A44-4D6F-1226-9C60-0050E4C00067, unique à chaque fois que vous appelez cette fonction, même sur plusieurs périphériques et emplacements.

Référence: https://developer.Apple.com/library/ios/documentation/Foundation/Reference/NSUUID_Class/Reference/Reference.html

37
MaikonFarias

Si vous utilisez CoreData pour enregistrer les parties jouées, la variable NSManagedObject de objectID devrait vous convenir sans effort supplémentaire.

3
Akshay

Vous pouvez créer une catégorie de UIApplication, UIDevice ou comme vous le préférez (exemple 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 () est cette fonction

NSString* UUID () {

    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
    CFRelease(uuidRef);
    return (__bridge NSString *)uuidStringRef;
}

cela génère un identifiant unique stocké dans le NSUserDefault à réutiliser chaque fois que l’application en a besoin - Cet identifiant sera unique et lié à l’installation de l’application, mais peut être utilisé par exemple pour tracer le nombre de périphériques abonnés au service APN, etc. ...

Après cela, vous pouvez l'utiliser de cette manière:

    NSString *uuid = [[UIApplication sharedApplication] getUUID];
2
Manu

Un horodatage simple (millisecondes * 10) devrait faire l'affaire:

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

Vous pouvez utiliser le temps en millisecondes ou de manière plus avancée GUID .

2
Justin

Vous n'avez pas dit que ça doit être aléatoire. Alors, pourquoi ne pas commencer par un nombre, puis ajouter simplement 1 au dernier nombre que vous avez généré.

Cette méthode devrait vous donner au moins 4 milliards de numéros uniques pour commencer:

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

Si vous avez un NSDictionary, vous pouvez générer un identifiant progressif à partir du dernier élément:

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

Vous devez faire attention, surtout si vous utilisez les routines d'incrémentation par 1, que si votre application est supprimée et rechargée sur l'iDevice, vous ne disposerez plus de votre numéro par défaut enregistré. Cela recommencera depuis le début. Si vous enregistrez les scores des utilisateurs, vous pouvez également enregistrer le nombre le plus élevé. Mieux vaut vérifier les routines de temps pour les secondes (ou millisecondes) après une certaine date. Le GUID mentionné ci-dessus est également utile si vous avez besoin de ce type d'unicité. 

0
Owen Hartnett