Quiero llamar a un método, pasarle la longitud y hacer que genere una cadena alfanumérica aleatoria.
¿Hay alguna biblioteca de utilidad que pueda tener un montón de este tipo de funciones?
Quiero llamar a un método, pasarle la longitud y hacer que genere una cadena alfanumérica aleatoria.
¿Hay alguna biblioteca de utilidad que pueda tener un montón de este tipo de funciones?
Aquí hay una implementación rápida y sucia. No ha sido probado.
NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
-(NSString *) randomStringWithLength: (int) len {
NSMutableString *randomString = [NSMutableString stringWithCapacity: len];
for (int i=0; i<len; i++) {
[randomString appendFormat: @"%C", [letters characterAtIndex: arc4random_uniform([letters length])]];
}
return randomString;
}
NSString
paraletters
cuando unachar
matriz simple funcionaría bien. De hecho, el uso[letters characterAtIndex:(rand() % [letters length])]
me parece menos conciso que sololetters[rand() % strlen(letters)]
. Las clases de Foundation son realmente útiles, pero para las cosas más simples, pueden servir para ofuscar nuestro código en lugar de mejorarlo.%C
lugar de%c
, porquecharacterAtIndex:
devuelve ununichar
arc4random_uniform((int)[letters length])
No es exactamente lo que pides, pero sigue siendo útil:
Salida de muestra:
fuente
fuente
alphabet
cada vez? Es constante y no depende del bucle.NSArray
almacena en caché sulength
, no debería ser un cuello de botella de rendimiento.Seguramente puedes hacer esto más corto:
fuente
Si está dispuesto a limitarse solo a caracteres hexadecimales, la opción más simple es generar un UUID:
Ejemplo de salida:
16E3DF0B-87B3-4162-A1A1-E03DB2F59654
.Si desea una cadena aleatoria más pequeña, puede tomar solo los primeros 8 caracteres.
Es un UUID la versión 4 que significa que el primer carácter de la 3ª y 4ª grupo no es al azar (que siempre será
4
y uno de8
,9
,A
oB
).Todos los demás caracteres de la cadena son completamente aleatorios y puede generar millones de UUID por segundo durante cientos de años sin mucho riesgo de que se genere el mismo UUID dos veces.
fuente
NSString *uuid = [UUID UUID]
Una versión de categoría de la respuesta de Jeff B.
NSString + Random.h
NSString + Random.m
fuente
También podría simplemente generar un UUID. Si bien no son realmente aleatorios, son complejos y únicos, lo que los hace parecer aleatorios para la mayoría de los usos. Genere uno como una cadena y luego tome un rango de caracteres igual a la longitud pasada.
fuente
Rápido
fuente
64
con uno calculadoupperBound
. CalculoupperBound
fuera del bloque porque creo que funciona mejor.Aquí hay una forma diferente de abordarlo. En lugar de utilizar una cadena de caracteres preparada, puede emitir entre enteros y caracteres, y generar una lista dinámica de caracteres para seleccionar. Es bastante delgado y rápido, pero tiene un poco más de código.
Cuando estoy haciendo una generación aleatoria de personajes, prefiero trabajar directamente con enteros y lanzarlos, en lugar de escribir la lista de caracteres de los que quiero dibujar. Declarar las variables en la parte superior lo hace más independiente del sistema, pero este código supone que los números tendrán un valor más bajo que las letras, y que las letras mayúsculas tendrán un valor más bajo que las letras minúsculas.
fuente
Solución alternativa en Swift
fuente
Agregando a la buena respuesta dada por Melvin, aquí hay una función que hice (¡ en SWIFT! ) Para obtener una cadena aleatoria:
Aquí hay un resultado de prueba de llamar
randomStringOfLength(10)
: uXa0igA8wmfuente
Genera una cadena aleatoria alfanumérica en minúsculas con una longitud dada:
fuente
Modificación de algunas ideas aquí, y en Swift 4.0 hecho
Uso:
fuente
Si desea una cadena unicode aleatoria, puede crear bytes aleatorios y luego usar los válidos.
La conversión de NSString a NSData y viceversa es necesaria para obtener una cadena UTF-8 válida. Tenga en cuenta que la longitud no será necesariamente la longitud del NSString creado al final.
fuente
Hice esto usando un simple en
char[]
lugar de unNSString *
para el alfabeto. Agregué esto a una categoría NSString.fuente
fuente
Método para llamar:
Método:
Resultados:
fuente
para Swift 3.0
fuente
fuente
Modificación de la respuesta de keithyip:
fuente