Wie kann ich in Swift eine zufällige alphanumerische Zeichenfolge generieren?
208
Swift 4.2 Update
Swift 4.2 führte wesentliche Verbesserungen im Umgang mit zufälligen Werten und Elementen ein. Sie können hier mehr über diese Verbesserungen lesen . Hier ist die Methode auf wenige Zeilen reduziert:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
return String((0..<length).map{ _ in letters.randomElement()! })
}
Swift 3.0 Update
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
}
Ursprüngliche Antwort:
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
}
Hier ist eine gebrauchsfertige Lösung in Swiftier-Syntax . Sie können es einfach kopieren und einfügen:
Wenn Sie ein Framework bevorzugen , das auch einige weitere praktische Funktionen bietet, können Sie mein Projekt HandySwift ausprobieren . Es enthält auch eine schöne Lösung für zufällige alphanumerische Zeichenfolgen :
quelle
Sie können es auch folgendermaßen verwenden:
Einfache Verwendung:
Swift 3-Syntax:
Swift 4 Syntax:
quelle
Schnell:
quelle
AKTUALISIERT 2019.
Im ungewöhnlichen Fall das
Leistung ist wichtig.
Hier ist eine extrem klare Funktion, die zwischengespeichert wird :
Dies ist der Fall, wenn Sie einen festen, bekannten Zeichensatz haben.
Praktischer Tipp:
Beachten Sie, dass "abcdefghjklmnpqrstuvwxyz12345789" "schlechte" Zeichen vermeidet
Es gibt keine 0, o, O, i usw. Die Charaktere, die Menschen oft verwirren.
Dies geschieht häufig für Buchungscodes und ähnliche Codes, die von menschlichen Kunden verwendet werden.
quelle
repeating:count:
.Einfach und schnell - UUID (). UuidString
Swift 3.0
BEARBEITEN
Bitte nicht verwechseln mit ,
UIDevice.current.identifierForVendor?.uuidString
es wird nicht zufälligen Werten geben.quelle
Mit Swift 4.2 erstellen Sie am besten eine Zeichenfolge mit den gewünschten Zeichen und wählen dann mit randomElement jedes Zeichen aus:
Ich Detail mehr über diese Änderungen hier .
quelle
Swift 2.2 Version
Rufen Sie grundsätzlich diese Methode auf, die eine zufällige Zeichenfolge mit der Länge der an die Funktion übergebenen Ganzzahl generiert. Um die möglichen Zeichen zu ändern, bearbeiten Sie einfach die Zeichenfolge stringString. Unterstützt auch Unicode-Zeichen.
https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327
quelle
EXC_BAD_INSTRUCTION
let random = randomString(16)
. Das EXC war nur auf einem realen Gerät und ich habe es nicht in einem Simulator gesehen und es war zeitweise auf dem Gerät.random % count
nicht nicht (immer) schafft eine gleichmäßige Verteilung. Wenn dies für Sie relevant ist, suchen Sie nach anderen Antworten, die Sie verwendenarc4random_uniform()
.Für Leute, die nicht den gesamten Zeichensatz eingeben möchten:
quelle
für Swift 3.0
quelle
Ein reiner Swift-Zufall
String
von jedemCharacterSet
.Verwendung:
CharacterSet.alphanumerics.randomString(length: 100)
Die
characters()
Funktion ist meine schnellste bekannte Implementierung .quelle
quelle
Meine noch schnellere Umsetzung der Frage:
quelle
Loop-frei, jedoch auf 43 Zeichen begrenzt. Wenn Sie mehr benötigen, kann es geändert werden. Dieser Ansatz hat zwei Vorteile gegenüber der alleinigen Verwendung einer UUID:
UUID()
nur Großbuchstaben generiert werdenUUID
ist höchstens 36 Zeichen lang (einschließlich der 4 Bindestriche), aber nur 32 Zeichen lang. Wenn Sie etwas länger benötigen oder keine Bindestriche möchten, können Sie dies mithilfe derbase64EncodedString
Handles tunDiese Funktion verwendet auch a
UInt
, um negative Zahlen zu vermeiden.Aufruf in einer Schleife zur Überprüfung der Ausgabe:
Welches produziert:
quelle
Swift 5.0
quelle
Das Problem bei der Beantwortung von Fragen zu "Ich brauche zufällige Zeichenfolgen" (in welcher Sprache auch immer) ist, dass praktisch jede Lösung eine fehlerhafte primäre Spezifikation der Zeichenfolgenlänge verwendet . Die Fragen selbst zeigen selten, warum die zufälligen Zeichenfolgen benötigt werden, aber ich würde Sie herausfordern, dass Sie selten zufällige Zeichenfolgen mit einer Länge von beispielsweise 8 benötigen. Was Sie ausnahmslos benötigen, ist eine Anzahl eindeutiger Zeichenfolgen , die beispielsweise als Bezeichner für einen bestimmten Zweck verwendet werden sollen.
Es gibt zwei Möglichkeiten, streng eindeutige Zeichenfolgen zu erhalten: deterministisch (was nicht zufällig ist) und Speichern / Vergleichen (was belastend ist). Was machen wir? Wir geben den Geist auf. Wir gehen stattdessen mit probabilistischer Einzigartigkeit . Das heißt, wir akzeptieren, dass ein gewisses (jedoch geringes) Risiko besteht, dass unsere Saiten nicht eindeutig sind. Hier ist das Verständnis von Kollisionswahrscheinlichkeit und Entropie hilfreich.
Daher werde ich das unveränderliche Bedürfnis so umformulieren, dass einige Zeichenfolgen mit einem geringen Wiederholungsrisiko benötigt werden. Nehmen wir als konkretes Beispiel an, Sie möchten ein Potenzial von 5 Millionen IDs generieren. Sie möchten nicht jede neue Zeichenfolge speichern und vergleichen, und Sie möchten, dass sie zufällig ist, sodass Sie ein gewisses Wiederholungsrisiko akzeptieren. Nehmen wir zum Beispiel ein Risiko von weniger als 1 in einer Billion Wiederholungswahrscheinlichkeit. Also, welche Länge der Saite brauchst du? Nun, diese Frage ist nicht genau spezifiziert, da sie von den verwendeten Zeichen abhängt. Aber was noch wichtiger ist, es ist falsch. Was Sie brauchen, ist eine Angabe der Entropie der Saiten, nicht ihrer Länge. Die Entropie kann in direktem Zusammenhang mit der Wahrscheinlichkeit einer Wiederholung in einer bestimmten Anzahl von Zeichenfolgen stehen. Stringlänge kann nicht.
Und hier kann eine Bibliothek wie EntropyString helfen. So generieren Sie zufällige IDs mit einer Wahrscheinlichkeit von weniger als 1 in einer Billion Wiederholungen in 5 Millionen Zeichenfolgen mit
EntropyString
:EntropyString
Verwendet standardmäßig einen Zeichensatz mit 32 Zeichen. Es gibt andere vordefinierte Zeichensätze, und Sie können auch Ihre eigenen Zeichen angeben. Beispiel: Generieren von IDs mit derselben Entropie wie oben, jedoch unter Verwendung von Hex-Zeichen:Beachten Sie den Unterschied in der Zeichenfolgenlänge aufgrund des Unterschieds in der Gesamtzahl der Zeichen im verwendeten Zeichensatz. Das Risiko einer Wiederholung in der angegebenen Anzahl potenzieller Zeichenfolgen ist gleich. Die Stringlängen sind nicht. Und das Beste ist, dass das Wiederholungsrisiko und die potenzielle Anzahl von Zeichenfolgen explizit sind. Kein Raten mehr mit Stringlänge.
quelle
Wenn Ihre zufällige Zeichenfolge sicher-zufällig sein soll, verwenden Sie Folgendes:
quelle
Wenn Sie nur eine eindeutige Kennung benötigen,
UUID().uuidString
kann dies Ihren Zwecken dienen.quelle
Aktualisiert für Swift 4. Verwenden Sie eine verzögert gespeicherte Variable für die Klassenerweiterung. Dies wird nur einmal berechnet.
quelle
SWIFT 4
Verwendung von RandomNumberGenerator für eine bessere Leistung als Apple-Empfehlung
Verwendung:
String.random(20)
Ergebnis:CifkNZ9wy9jBOT0KJtV4
quelle
Dies ist die Swift -est Lösung , die ich tun konnte. Swift 3.0
quelle
quelle