¿Cómo puedo generar una cadena alfanumérica aleatoria en Swift?
208
Actualización Swift 4.2
Swift 4.2 introdujo mejoras importantes al tratar con valores y elementos aleatorios. Puede leer más sobre esas mejoras aquí . Aquí está el método reducido a unas pocas líneas:
func randomString(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
return String((0..<length).map{ _ in letters.randomElement()! })
}
Actualización de 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
}
Respuesta original:
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
}
Aquí hay una solución lista para usar en sintaxis Swiftier . Simplemente puede copiarlo y pegarlo:
Si prefiere un Framework que también tenga algunas características más prácticas, no dude en consultar mi proyecto HandySwift . También incluye una hermosa solución para cadenas alfanuméricas aleatorias :
fuente
También puede usarlo de la siguiente manera:
Uso simple:
Sintaxis de Swift 3:
Sintaxis de Swift 4:
fuente
Rápido:
fuente
Con Swift 4.2, su mejor opción es crear una cadena con los personajes que desee y luego usar randomElement para elegir cada personaje:
Detallo más sobre estos cambios aquí .
fuente
ACTUALIZADO 2019.
En el caso inusual que
el rendimiento importa.
Aquí hay una función extremadamente clara que almacena en caché :
Esto es para cuando tiene un juego de caracteres fijo y conocido .
Consejo práctico:
Tenga en cuenta que "abcdefghjklmnpqrstuvwxyz12345789" evita los caracteres 'malos'
No hay 0, o, O, i, etc ... los caracteres que los humanos a menudo confunden.
Esto se hace a menudo para códigos de reserva y códigos similares que utilizarán los clientes humanos.
fuente
repeating:count:
.Simple y rápido : UUID (). UuidString
Swift 3.0
EDITAR
Por favor no confunda con
UIDevice.current.identifierForVendor?.uuidString
que no dará valores aleatorios.fuente
Versión Swift 2.2
Básicamente llame a este método que generará una cadena aleatoria de la longitud del entero entregado a la función. Para cambiar los posibles caracteres solo edite la cadena caracteresString. Soporta caracteres unicode también.
https://gist.github.com/gingofthesouth/54bea667b28a815b2fe33a4da986e327
fuente
EXC_BAD_INSTRUCTION
let random = randomString(16)
. El EXC solo estaba en un dispositivo real y no lo vi en un simulador y era intermitente en el dispositivo.random % count
no no (siempre) crear una distribución uniforme. Si esto es relevante para usted, busque otras respuestas que utilicenarc4random_uniform()
.Para las personas que no quieren escribir todo el conjunto de caracteres:
fuente
para Swift 3.0
fuente
Un Swift puro al azar
String
de cualquieraCharacterSet
.Uso:
CharacterSet.alphanumerics.randomString(length: 100)
La
characters()
función es mi implementación más rápida conocida .fuente
fuente
Mi implementación aún más rápida de la pregunta:
fuente
Sin bucle, aunque está limitado a 43 caracteres. Si necesita más, se puede modificar. Este enfoque tiene dos ventajas sobre el uso exclusivo de un UUID:
UUID()
solo genera letras mayúsculasUUID
tiene como máximo 36 caracteres de largo (incluidos los 4 guiones), pero solo 32 caracteres sin él. Si necesita algo más, o no quiere incluir guiones, el uso de losbase64EncodedString
manejadores estoAdemás, esta función utiliza a
UInt
para evitar números negativos.Llamarlo en un bucle para verificar la salida:
Que produce:
fuente
Swift 5.0
fuente
El problema con las respuestas a las preguntas "Necesito cadenas aleatorias" (en cualquier idioma) es que prácticamente todas las soluciones utilizan una especificación primaria defectuosa de longitud de cadena . Las preguntas en sí rara vez revelan por qué se necesitan las cadenas aleatorias, pero desafiaría que rara vez necesite cadenas aleatorias de longitud, digamos 8. Lo que invariablemente necesita es un cierto número de cadenas únicas , por ejemplo, para usar como identificadores para algún propósito.
Hay dos formas principales de obtener cadenas estrictamente únicas : determinista (que no es aleatorio) y almacenar / comparar (que es oneroso). qué hacemos? Renunciamos al fantasma. Vamos con unicidad probabilística en su lugar. Es decir, aceptamos que existe un riesgo (aunque pequeño) de que nuestras cadenas no sean únicas. Aquí es donde es útil comprender la probabilidad de colisión y la entropía .
Por lo tanto, reformularé la necesidad invariable de necesitar cierto número de cadenas con un pequeño riesgo de repetición. Como ejemplo concreto, supongamos que desea generar un potencial de 5 millones de ID. No desea almacenar y comparar cada nueva cadena, y desea que sean aleatorias, por lo que acepta cierto riesgo de repetición. Como ejemplo, digamos un riesgo de menos de 1 en un billón de posibilidades de repetición. Entonces, ¿qué longitud de cuerda necesitas? Bueno, esa pregunta no está especificada, ya que depende de los caracteres utilizados. Pero lo más importante, es equivocado. Lo que necesita es una especificación de la entropía de las cadenas, no su longitud. La entropía puede estar directamente relacionada con la probabilidad de una repetición en cierto número de cadenas. La longitud de la cuerda no puede.
Y aquí es donde una biblioteca como EntropyString puede ayudar. Para generar ID aleatorios que tengan menos de 1 en un billón de posibilidades de repetirse en 5 millones de cadenas usando
EntropyString
:EntropyString
utiliza un conjunto de caracteres con 32 caracteres de forma predeterminada. Existen otros conjuntos de caracteres predefinidos, y también puede especificar sus propios caracteres. Por ejemplo, generar ID con la misma entropía que la anterior pero utilizando caracteres hexadecimales:Tenga en cuenta la diferencia en la longitud de la cadena debido a la diferencia en el número total de caracteres en el conjunto de caracteres utilizado. El riesgo de repetición en el número especificado de cadenas potenciales es el mismo. Las longitudes de cadena no son. Y lo mejor de todo, el riesgo de repetición y el número potencial de cadenas es explícito. No más adivinanzas con la longitud de la cuerda.
fuente
Si su cadena aleatoria debe ser segura-aleatoria, use esto:
fuente
Si solo necesita un identificador único,
UUID().uuidString
puede servir a sus propósitos.fuente
Actualizado para Swift 4. Use una variable almacenada perezosa en la extensión de clase. Esto solo se calcula una vez.
fuente
SWIFT 4
Uso de RandomNumberGenerator para un mejor rendimiento como recomendación de Apple
Uso:
String.random(20)
Resultado:CifkNZ9wy9jBOT0KJtV4
fuente
Esta es la solución más rápida que se me ocurrió. Swift 3.0
fuente
fuente