La génération aléatoire d'une chaîne alphanumérique dans le Cacao
Je veux appeler une méthode, passer la longueur et ont la génération aléatoire d'une chaîne alphanumérique.
Il n'existe aucun utilitaire de bibliothèques qui peuvent avoir un tas de ces types de fonctions?
Vous devez vous connecter pour publier un commentaire.
Voici un moyen rapide et sale de mise en œuvre. N'a pas été testé.
NSString
est très bien.#define RKRandom(x) (arc4random() % ((NSUInteger)(x) + 1))
NSString
pourletters
quand un simplechar
tableau serait très bien fonctionner. En fait, à l'aide de[letters characterAtIndex:(rand() % [letters length])]
me semble être moins concis que justeletters[rand() % strlen(letters)]
. Les classes de base sont vraiment utile, mais pour les choses les plus simples, ils peuvent servir à obfusticate notre code plutôt que de l'améliorer.%C
au lieu de%c
, parce quecharacterAtIndex:
renvoie uneunichar
arc4random_uniform()
pour éviter modulo biais.arc4random_uniform([letters length])
. De l'homme pagesarc4random(void);
etarc4random_uniform(u_int32_t upper_bound);
arc4random_uniform((int)[letters length])
NSString*
variable vous pouvez remplaceralphabet
à l'intérieur de la boucle for avec[NSCharacterSet alphanumericCharacterSet]
et changement[alphabet length]
à[[NSCharacterSet alphanumericCharacterSet] count]
% [letters length]
semble inutile puisquearc4random_uniform([letters length])
fait le truc sur son propre.-count
méthode de bud.Pas exactement ce que vous demandez, mais toujours utile:
Exemple de sortie:
alphabet
à chaque fois? Elle est constante et ne dépend pas de la boucle.NSArray
cache sonlength
, ne devrait pas être un goulot d'étranglement des performances.Certes, vous pouvez faire cette courte:
Si vous êtes prêt à vous limiter à des caractères hexadécimaux, puis l'option la plus simple est de générer un UUID:
Exemple de sortie:
16E3DF0B-87B3-4162-A1A1-E03DB2F59654
.Si vous voulez une petite chaîne aléatoire, alors vous pouvez prendre juste les 8 premiers caractères.
C'est une version 4 UUID qui signifie que le premier caractère dans le 3ème et le 4ème groupe n'est pas aléatoire (ils seront toujours
4
et l'un des8
,9
,A
ouB
).Tous les autres caractères d'une chaîne est complètement aléatoire et vous pouvez générer des millions de Uuid de chaque seconde pour des centaines d'années sans trop de risque de le même UUID généré deux fois.
NSString *uuid = [UUID UUID]
Une catégorie de la version de Jeff B de la réponse.
NSString+Aléatoire.h
NSString+Aléatoire.m
Vous pourriez tout aussi bien générer un UUID. Bien que pas vraiment au hasard, ils sont complexes et uniques, ce qui les rend semblent aléatoires pour la plupart des utilisations. Générer un comme une chaîne, puis de prendre une série de caractères égal à la longueur.
Swift
64
avec un calculéesupperBound
. Je calculeupperBound
en dehors du bloc car je pense que cela fonctionne mieux.Voici une autre façon de l'aborder. Au lieu d'utiliser une chaîne de caractères, vous pouvez convertir entre les entiers et les personnages, et de générer une liste dynamique de caractères à sélectionner. Il est assez léger et rapide, mais a un peu plus de code.
Quand je fais du caractère aléatoire de la génération, je préfère travailler directement avec des entiers, et les jetèrent dessus, au lieu d'écrire la liste des caractères que je veux en tirer. Déclarer les variables dans le haut, il est plus indépendant du système, mais ce code suppose que les nombres ont une valeur inférieure à celle des lettres, et que les majuscules ont une valeur inférieure à celle des lettres minuscules.
Solution Alternative à Swift
Ajoutant à la bonne réponse donnée par Melvin, voici une fonction que j'ai faite (dans SWIFT!) pour obtenir une chaîne de caractères aléatoires:
Ici est le résultat d'un test à partir de l'appelant
randomStringOfLength(10)
: uXa0igA8wmGénère alphanumériques minuscules chaîne aléatoire de longueur donnée:
Modification de quelques idées ici, et en fait Swift 4.0
Utilisation:
Si vous voulez un hasard chaîne unicode, vous pouvez créer des octets aléatoires, puis utilisez les valides.
La conversion de NSString à NSData et à l'arrière est nécessaire pour obtenir un valide chaîne UTF-8.
Sachez que la longueur ne sera pas nécessairement la longueur de la NSString créé à la fin.
Je l'ai fait à l'aide d'un simple
char[]
au lieu d'uneNSString *
de l'alphabet. J'ai ajouté ceci à un NSString catégorie.Méthode à appeler:
Méthode:
Résultats:
pour Swift 3.0
Modification pour keithyip réponse: