Comment puis-je générer une chaîne alphanumérique aléatoire dans Swift?
208
Mise à jour Swift 4.2
Swift 4.2 a introduit des améliorations majeures dans le traitement des valeurs et des éléments aléatoires. Vous pouvez en savoir plus sur ces améliorations ici . Voici la méthode réduite à quelques lignes:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
return String((0..<length).map{ _ in letters.randomElement()! })
}
Mise à jour Swift 3.0
func randomString(length: Int) -> String {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
Réponse originale:
func randomStringWithLength (len : Int) -> NSString {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
var randomString : NSMutableString = NSMutableString(capacity: len)
for (var i=0; i < len; i++){
var length = UInt32 (letters.length)
var rand = arc4random_uniform(length)
randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
}
return randomString
}
Voici une solution prête à l'emploi dans la syntaxe Swiftier . Vous pouvez simplement le copier-coller:
Si vous préférez un Framework qui possède également des fonctionnalités plus pratiques, n'hésitez pas à consulter mon projet HandySwift . Il comprend également une belle solution pour les chaînes alphanumériques aléatoires :
la source
Vous pouvez également l'utiliser de la manière suivante:
Utilisation simple:
Syntaxe de Swift 3:
Syntaxe de Swift 4:
la source
Rapide:
la source
Avec Swift 4.2, votre meilleur pari est de créer une chaîne avec les caractères que vous souhaitez, puis d'utiliser randomElement pour choisir chaque caractère:
Je détaille plus sur ces changements ici .
la source
MISE À JOUR 2019.
Dans le cas inhabituel
la performance compte.
Voici une fonction extrêmement claire qui met en cache :
C'est pour quand vous avez un jeu de caractères fixe et connu .
Conseil pratique:
Notez que «abcdefghjklmnpqrstuvwxyz12345789» évite les «mauvais» caractères
Il n'y a pas de 0, o, O, i, etc ... les personnages confondent souvent les humains.
Cela est souvent fait pour les codes de réservation et les codes similaires que les clients humains utiliseront.
la source
repeating:count:
.Simple et rapide - UUID (). UuidString
Swift 3.0
ÉDITER
Veuillez ne pas confondre avec
UIDevice.current.identifierForVendor?.uuidString
cela ne donnera pas de valeurs aléatoires.la source
Version Swift 2.2
Appelez essentiellement cette méthode qui générera une chaîne aléatoire de la longueur de l'entier remis à la fonction. Pour modifier les caractères possibles, modifiez simplement la chaîne de caractères de chaîne. Prend également en charge les caractères unicode.
https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327
la source
EXC_BAD_INSTRUCTION
let random = randomString(16)
. L'EXC n'était que sur un vrai appareil et je ne l'ai pas vu dans un simulateur et il était intermittent sur l'appareil.random % count
ne crée pas (toujours) une distribution uniforme. Si cela vous concerne, recherchez d'autres réponses utilesarc4random_uniform()
.Pour les gens qui ne veulent pas taper l'ensemble complet des caractères:
la source
pour Swift 3.0
la source
Un Swift pur aléatoire
String
de toutCharacterSet
.Usage:
CharacterSet.alphanumerics.randomString(length: 100)
La
characters()
fonction est mon implémentation la plus rapide connue .la source
la source
Ma mise en œuvre encore plus rapide de la question:
la source
Sans boucle, bien qu'il soit limité à 43 caractères. Si vous en avez besoin de plus, il peut être modifié. Cette approche présente deux avantages par rapport à l'utilisation exclusive d'un UUID:
UUID()
ne génère que des lettres majusculesUUID
comporte au maximum 36 caractères (y compris les 4 tirets), mais seulement 32 caractères sans. Si vous avez besoin de quelque chose de plus long ou si vous ne voulez pas de tirets inclus, l'utilisation desbase64EncodedString
poignéesDe plus, cette fonction utilise un
UInt
pour éviter les nombres négatifs.L'appeler en boucle pour vérifier la sortie:
Ce qui produit:
la source
Swift 5.0
la source
Le problème avec les réponses aux questions "J'ai besoin de chaînes aléatoires" (dans n'importe quelle langue) est que pratiquement chaque solution utilise une spécification primaire erronée de longueur de chaîne . Les questions elles-mêmes révèlent rarement pourquoi les chaînes aléatoires sont nécessaires, mais je vous mets au défi que vous ayez rarement besoin de chaînes aléatoires de longueur, disons 8. Ce dont vous avez invariablement besoin, c'est d'un certain nombre de chaînes uniques , par exemple, à utiliser comme identificateurs dans un certain but.
Il existe deux façons principales d'obtenir des chaînes strictement uniques : de manière déterministe (qui n'est pas aléatoire) et de stocker / comparer (ce qui est onéreux). Qu'est-ce qu'on fait? Nous abandonnons le fantôme. Nous optons plutôt pour l' unicité probabiliste . Autrement dit, nous acceptons qu'il existe un risque (aussi faible soit-il) que nos cordes ne soient pas uniques. C'est là que la compréhension de la probabilité de collision et de l' entropie est utile.
Je vais donc reformuler le besoin invariable comme nécessitant un certain nombre de chaînes avec un petit risque de répétition. À titre d'exemple concret, supposons que vous souhaitiez générer un potentiel de 5 millions d'ID. Vous ne voulez pas stocker et comparer chaque nouvelle chaîne et vous voulez qu'elles soient aléatoires, vous acceptez donc un risque de répétition. Par exemple, disons un risque de moins de 1 sur mille milliards de chances de répétition. Alors, quelle longueur de chaîne avez-vous besoin? Eh bien, cette question est sous-spécifiée car elle dépend des caractères utilisés. Mais plus important encore, c'est erroné. Ce dont vous avez besoin est une spécification de l'entropie des cordes, pas de leur longueur. L'entropie peut être directement liée à la probabilité de répétition dans un certain nombre de chaînes. La longueur de chaîne ne peut pas.
Et c'est là qu'une bibliothèque comme EntropyString peut vous aider. Pour générer des ID aléatoires qui ont moins de 1 chance sur 1 000 milliards de répétitions dans 5 millions de chaînes en utilisant
EntropyString
:EntropyString
utilise un jeu de caractères avec 32 caractères par défaut. Il existe d'autres jeux de caractères prédéfinis et vous pouvez également spécifier vos propres caractères. Par exemple, générer des ID avec la même entropie que ci-dessus mais en utilisant des caractères hexadécimaux:Notez la différence de longueur de chaîne en raison de la différence du nombre total de caractères dans le jeu de caractères utilisé. Le risque de répétition dans le nombre spécifié de chaînes potentielles est le même. Les longueurs de chaîne ne le sont pas. Et surtout, le risque de répétition et le nombre potentiel de chaînes est explicite. Plus besoin de deviner avec la longueur de la chaîne.
la source
Si votre chaîne aléatoire doit être sécurisée-aléatoire, utilisez ceci:
la source
Si vous avez juste besoin d'un identifiant unique, cela
UUID().uuidString
peut servir vos objectifs.la source
Mis à jour pour Swift 4. Utilisez une variable stockée paresseuse sur l'extension de classe. Cela n'est calculé qu'une seule fois.
la source
SWIFT 4
Utilisation de RandomNumberGenerator pour de meilleures performances comme recommandation Apple
Utilisation:
String.random(20)
Résultat:CifkNZ9wy9jBOT0KJtV4
la source
Ceci est la Swift solution -est je pouvais trouver. Swift 3.0
la source
la source