Quiero una cadena de 5 caracteres compuesta de caracteres elegidos al azar del conjunto [a-zA-Z0-9]
.
¿Cuál es la mejor manera de hacer esto con JavaScript?
javascript
random
Tom Lehman
fuente
fuente
true-random
resultado! Son solamentepseudo-random
. Cuando use cadenas aleatorias para protección o seguridad, ¡no use ninguna de ellas! Pruebe una de estas aplicaciones: random.orgMath.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
Respuestas:
Creo que esto funcionará para ti:
fuente
+=
cadenas como esta hace que tenga un comportamiento O (n ^ 2). Si desea crear cadenas más largas, debe crear una matriz de caracteres individuales y unirlos al final.+=
menudo es más rápido por alguna razón, incluso se usa dentro de bucles - jsperf.com/join-vs-concatenationcrypto
en su lugar.Nota: El algoritmo anterior tiene las siguientes debilidades:
Math.random()
puede producir resultados predecibles ("aleatorios" pero no realmente aleatorios) dependiendo de la implementación. La cadena resultante no es adecuada cuando necesita garantizar unicidad o imprevisibilidad.fuente
Math.random().toString(36).substr(2, 5)
, porque.substring(7)
hace que tenga más de 5 caracteres. Puntos completos, todavía!toString
método de un tipo de número en javascript toma un parámetro opcional para convertir el número en una base dada. Si pasa dos, por ejemplo, verá su número representado en binario. Similar al hexadecimal (base 16), la base 36 usa letras para representar dígitos más allá de 9. Al convertir un número aleatorio a la base 36, terminarás con un montón de letras y números aparentemente aleatorios.(Math.random() + 1).toString(36).substring(7);
Math.random es malo para este tipo de cosas
Opción 1
Si puede hacer este lado del servidor , simplemente use el módulo de cifrado :
La cadena resultante tendrá el doble de longitud que los bytes aleatorios que genere; cada byte codificado en hexadecimal tiene 2 caracteres. 20 bytes serán 40 caracteres de hexadecimal.
opcion 2
Si tienes que hacer esto cliente , quizás pruebe el módulo uuid:
Opción 3
Si tiene que hacer este lado del cliente y no tiene que admitir navegadores antiguos, puede hacerlo sin dependencias:
Para más información sobre
crypto.getRandomValues
-Aquí hay un pequeño ejemplo de consola:
Para el soporte de IE11 puede usar:
Para la cobertura del navegador, consulte https://caniuse.com/#feat=getrandomvalues
fuente
.map()
en la opción 3.Array.from(arr, dec2hex).join('')
===Array.from(arr).map(dec2hex).join('')
. Gracias por presentarme estas características :-)require
puede usar el módulo solo en el lado del servidor?Corto, fácil y confiable.
Devuelve exactamente 5 caracteres aleatorios, a diferencia de algunas de las respuestas mejor calificadas que se encuentran aquí.
fuente
Math.random().toString(36)
devuelve un número con menos de 5 caracteres?function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
Aquí hay una mejora en la excelente respuesta de doubletap . El original tiene dos inconvenientes que se abordan aquí:
Primero, como otros han mencionado, tiene una pequeña probabilidad de producir cadenas cortas o incluso una cadena vacía (si el número aleatorio es 0), lo que puede romper su aplicación. Aquí hay una solución:
En segundo lugar, tanto el original como la solución anterior limitan el tamaño de la cadena N a 16 caracteres. Lo siguiente devolverá una cadena de tamaño N para cualquier N (pero tenga en cuenta que el uso de N> 16 no aumentará la aleatoriedad ni disminuirá la probabilidad de colisiones):
Explicación:
Pensamientos adicionales:
Actualizar:
Aquí hay un par de otras frases de estilo funcional que se me ocurrieron. Se diferencian de la solución anterior en que:
Entonces, digamos que tu alfabeto de elección es
Entonces estos dos son equivalentes entre sí, por lo que puede elegir el que sea más intuitivo para usted:
y
Editar:
Parece que qubyte y Martijn de Milliano idearon soluciones similares a esta última (¡felicitaciones!), Que de alguna manera me perdí. Como no se ven tan cortos de un vistazo, lo dejaré aquí de todos modos en caso de que alguien realmente quiera una frase :-)
Además, se reemplazó 'nueva matriz' por 'matriz' en todas las soluciones para eliminar algunos bytes más.
fuente
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
da un resultado esperado que es más como el.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
La solución más compacta, porque
slice
es más corta quesubstring
. Restar del final de la cadena permite evitar el símbolo de coma flotante generado por larandom
función:o incluso
Actualización: Se agregó un enfoque más usando el
btoa
método:fuente
Math.random().toString(36).slice(-5);
- ¿Y siMath.random()
vuelve0.0
?"0"
;)Math.random()
devuelve0.5
el resultado es"0.i"
. No estoy seguro si hay otros casos límite. Solo quería señalar que esta no es una respuesta correcta a la pregunta (5 caracteres de [a-zA-Z0-9]).(+new Date + Math.random())
para prevenir este caso. De todos modos, gracias por la nota.Algo como esto debería funcionar
Llame con el juego de caracteres predeterminado [a-zA-Z0-9] o envíe el suyo:
fuente
len
directamente en unwhile
bucleUna versión más nueva con es6 spread operator :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
es un número arbitrario, puede elegir la longitud de token que desee36
es el número máximo de radix que puede pasar a numeric.toString () , lo que significa todos los números y letras minúsculas az2
utiliza para seleccionar el 3er índice de la cadena aleatoria que se ve así:"0.mfbiohx64i"
podríamos tomar cualquier índice después0.
fuente
fuente
while(s.length< L) s+= randomchar();
while(L--)
lo hará'A'.charCodeAt(0)
que el mágico55
(y lo mismo para el61
). Particularmente desde entonces, en mi plataforma, el número mágico que regresa es65
. Ese código también se documentará mejor.Generador de cadenas aleatorias (alfanumérico | alfa | numérico)
Si bien lo anterior utiliza verificaciones adicionales para la salida de A / N, A, N deseada , vamos a desglosar lo esencial (solo alfanumérico) para una mejor comprensión:
var str = "";
para concatenar caracteres aleatoriosrand
número de índice del 0 al 61 (0..9 + A..Z + a..z = 62)rand
(ya que es 0..61) incrementándola en algún número (vea los ejemplos a continuación) para volver a la derechaCharCode
número y el Carácter relacionado.str
unString.fromCharCode( incremented rand )
Imaginemos los rangos de la tabla de caracteres ASCII :
Math.floor( Math.random * 62 )
da un rango de0..61
(lo que necesitamos). Arreglemosel azar para obtener los rangos correctos de charCode :
La lógica de operación condicional de la tabla anterior:
De la explicación anterior, aquí está el fragmento alfanumérico resultante :
O si vas a:
fuente
La forma más simple es:
Esto genera cadenas aleatorias de 5 caracteres en función de la hora actual. Ejemplo de salida es
4mtxj
o4mv90
o4mwp1
El problema con esto es que si lo llamas dos veces en el mismo segundo, generará la misma cadena.
La forma más segura es:
Esto generará una cadena aleatoria de 4 o 5 caracteres, siempre diferente. Ejemplo de salida es como
30jzm
o1r591
o4su1a
En ambos sentidos, la primera parte genera un número aleatorio. La
.toString(36)
parte arroja el número a una representación base36 (alfadecimal) del mismo.fuente
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
para cubrirlo.(Math.random()*1e20).toString(36)
.Aquí hay algunos liners fáciles. Cambiar
new Array(5)
para establecer la longitud.Incluso
0-9a-z
Incluso
0-9a-zA-Z
fuente
Sé que todos lo han entendido bien, pero sentí que quería probarlo de la manera más liviana posible (código ligero, no CPU):
Toma un poco de tiempo entenderlo, pero creo que realmente muestra cuán increíble es la sintaxis de JavaScript.
fuente
current = current ? current : '';
cuando puede escribircurrent = current || ''
?current || (current = '');
Si está usando Lodash o Underscore , entonces es muy simple:
fuente
_.sampleSize('asdfgh',5).join('')
Para cumplir con el requisito [a-zA-Z0-9] y longitud = 5 use
Ocurrirán letras minúsculas, mayúsculas y números.
fuente
En caso de que alguien esté interesado en una línea (aunque no esté formateada como tal para su conveniencia) que asigne la memoria de una vez (pero tenga en cuenta que para cadenas pequeñas realmente no importa), aquí le mostramos cómo hacerlo:
Puede reemplazar
5
por la longitud de la cadena que desee. Gracias a @AriyaHidayat en esta publicación por la solución a lamap
función que no funciona en la matriz dispersa creada porArray(5)
.fuente
Aquí está el método que creé.
Creará una cadena que contiene caracteres en mayúsculas y minúsculas.
Además, he incluido la función que creará una cadena alfanumérica también.
Ejemplos de trabajo:
http://jsfiddle.net/greatbigmassive/vhsxs/ (solo alfa)
http://jsfiddle.net/greatbigmassive/PJwg8/ (alfanumérico)
Actualización de julio de 2015
Esto hace lo mismo pero tiene más sentido e incluye todas las letras.
fuente
Suponiendo que use underscorejs , es posible generar cadenas aleatorias con elegancia en solo dos líneas:
fuente
fuente
Algoritmo rápido y mejorado. No garantiza el uniforme (ver comentarios).
fuente
crypto.getRandomValues
devuelve uno de los 256 valores únicos. Debido a que 256 no está dividido por 62, terminas teniendo una probabilidad ligeramente mayor de obtener caracteres AH. Creo que la mejor solución es hacer lo que hizo YouTube, y simplemente agregar 2 caracteres adicionales (posiblemente-
y_
) al conjunto de caracteres. De todos modos, gran trabajo: esta respuesta necesita mucho más amor :)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 yo desafiaría que rara vez necesite cadenas aleatorias de longitud, digamos 8. Lo que necesita invariablemente es cierto número de cadenas únicas. , por ejemplo, para usarlas 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 entender la probabilidad de colisión y la entropía es útil .
Así que 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, supongamos 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
entropy-string
:entropy-string
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
Esto es lo más limpio posible. También es rápido, http://jsperf.com/ay-random-string .
fuente
strLength - 1
: - /--strLength
astrLength--
me lo arregla.Puede recorrer una matriz de elementos y agregarlos recursivamente a una variable de cadena, por ejemplo, si desea una secuencia de ADN aleatoria:
fuente
No encontré una solución limpia para admitir caracteres en minúsculas y mayúsculas.
Solo soporte en minúsculas:
Math.random().toString(36).substr(2, 5)
Sobre la base de esa solución para admitir minúsculas y mayúsculas:
Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');
Cambie el
5
desubstr(2, 5)
adaptarse a la longitud necesaria.fuente
Un trazador de líneas:
fuente
Array(15)
a un valor menor. Por ejemplo:Array(4)
.Esto funciona seguro
fuente
¿Qué tal algo como esto ?:
Date.now().toString(36)
No muy aleatorio, pero corto y bastante único cada vez que lo llamas.fuente
Date.now()
solo tiene una resolución de milisegundos. Cuando se ejecuta en un bucle simple, por ejemplo, obtendrá muchos duplicados.for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
.Caracteres alfanuméricos insensibles al caso:
El beneficio de esta función es que puede obtener una cadena aleatoria de diferente longitud y garantiza la longitud de la cadena.
Mayúsculas y minúsculas todos los caracteres:
Caracteres personalizados
fuente
var possible
gusta en la respuesta aceptada, por lo que el resultado de la función es más configurable.Genera una cadena larga de 10 caracteres. La longitud se establece por parámetro (por defecto 10).
fuente
Puedes usar coderain . Es una biblioteca para generar códigos aleatorios según el patrón dado. Úselo
#
como marcador de posición para caracteres en mayúsculas y minúsculas, así como dígitos:Hay otros marcadores de posición como
A
letras mayúsculas o9
dígitos.Lo que puede ser útil es ese llamado
.next()
siempre le darán un resultado único para que no tenga que preocuparse por los duplicados.Aquí hay una aplicación de demostración que genera una lista de códigos aleatorios únicos .
Divulgación completa: soy el autor de coderain.
fuente