Eu quero uma seqüência de 5 caracteres composta por caracteres escolhidos aleatoriamente do conjunto [a-zA-Z0-9]
.
Qual é a melhor maneira de fazer isso com JavaScript?
javascript
random
Tom Lehman
fonte
fonte
true-random
resultado! Eles são apenaspseudo-random
. Ao usar seqüências aleatórias para proteção ou segurança, não use nenhuma delas !!! Tente uma destas APIs: random.orgMath.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
Respostas:
Eu acho que isso funcionará para você:
fonte
+=
cadeias como essa faz com que ele tenha comportamento O (n ^ 2). Se você deseja criar seqüências mais longas, crie uma matriz de caracteres individuais e junte-os no final.+=
é muitas vezes mais rápido por algum motivo, mesmo usado dentro de loops - jsperf.com/join-vs-concatenationcrypto
.Nota: O algoritmo acima tem os seguintes pontos fracos:
Math.random()
pode produzir resultados previsíveis ("aparência aleatória", mas não realmente aleatória), dependendo da implementação. A sequência resultante não é adequada quando você precisa garantir exclusividade ou imprevisibilidade.fonte
Math.random().toString(36).substr(2, 5)
, porque.substring(7)
faz com que ele tenha mais de 5 caracteres. Pontos completos, ainda!toString
método de um tipo de número em javascript usa um parâmetro opcional para converter o número em uma determinada base. Se você passar dois, por exemplo, verá seu número representado em binário. Semelhante ao hex (base 16), a base 36 usa letras para representar dígitos além de 9. Ao converter um número aleatório em base 36, você terminará com várias letras e números aparentemente aleatórios.(Math.random() + 1).toString(36).substring(7);
Math.random é ruim para esse tipo de coisa
Opção 1
Se você puder fazer isso no lado do servidor , use o módulo de criptografia -
A sequência resultante será duas vezes maior que os bytes aleatórios que você gerar; cada byte codificado em hexadecimal tem 2 caracteres. 20 bytes terão 40 caracteres hexadecimais.
opção 2
Se você precisar fazer isso do lado do cliente , talvez tente o módulo uuid -
Opção 3
Se você precisar fazer isso no lado do cliente e não precisar dar suporte a navegadores antigos, poderá fazê-lo sem dependências -
Para mais informações sobre
crypto.getRandomValues
-Aqui está um pequeno exemplo de console -
Para suporte ao IE11, você pode usar -
Para cobertura do navegador, consulte https://caniuse.com/#feat=getrandomvalues
fonte
.map()
na Opção 3.Array.from(arr, dec2hex).join('')
===Array.from(arr).map(dec2hex).join('')
. Obrigado por me apresentar estas características :-)require
módulo não pode ser usado apenas no lado do servidor?Curto, fácil e confiável
Retorna exatamente 5 caracteres aleatórios, ao contrário de algumas das respostas mais bem avaliadas encontradas aqui.
fonte
Math.random().toString(36)
retornar um número com menos de 5 caracteres?function getRandomString() { var result = ''; while (!result) result = Math.random().toString(36).substring(2); return result; };
Aqui está uma melhoria na excelente resposta do doubletap . O original tem duas desvantagens abordadas aqui:
Primeiro, como outros já mencionaram, há uma pequena probabilidade de produzir cadeias curtas ou mesmo uma cadeia vazia (se o número aleatório for 0), o que pode interromper o seu aplicativo. Aqui está uma solução:
Segundo, o original e a solução acima limitam o tamanho da string N a 16 caracteres. A seguir, retornará uma sequência de tamanho N para qualquer N (mas observe que usar N> 16 não aumentará a aleatoriedade nem diminuirá a probabilidade de colisões):
Explicação:
Pensamentos adicionais:
Atualizar:
Aqui estão algumas outras frases de estilo funcional que eu criei. Eles diferem da solução acima em que:
Então, digamos que seu alfabeto de escolha seja
Então, esses dois são equivalentes entre si, para que você possa escolher o que for mais intuitivo para você:
e
Editar:
Parece que o qubyte e o Martijn de Milliano apresentaram soluções semelhantes a esta (parabéns!), Das quais de alguma forma eu perdi. Como eles não parecem tão breves, deixarei aqui de qualquer maneira, caso alguém realmente queira uma frase :-)
Além disso, substituiu 'new Array' por 'Array' em todas as soluções para economizar mais alguns bytes.
fonte
(Math.random()+1).toString(36).substring(7);
Math.random().toString(36).substring(2,7)
dá um resultado esperado que é mais parecido com o.substring(2, n+2)
Array.apply(null, {length: 5}).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('')
A solução mais compacta, porque
slice
é mais curta quesubstring
. Subtrair do final da string permite evitar o símbolo de ponto flutuante gerado pelarandom
função:ou mesmo
Atualização: adicionada mais uma abordagem usando o
btoa
método:fonte
Math.random().toString(36).slice(-5);
- E seMath.random()
voltar0.0
?"0"
;)Math.random()
retorna0.5
o resultado é"0.i"
. Não tenho certeza se existem outros casos extremos. Só queria ressaltar que esta não é uma resposta correta para a pergunta (5 caracteres de [a-zA-Z0-9]).(+new Date + Math.random())
para evitar esse caso. De qualquer forma, obrigado pela nota.Algo assim deve funcionar
Ligue com o conjunto de caracteres padrão [a-zA-Z0-9] ou envie você mesmo:
fonte
len
diretamente em umwhile
circuitoUma versão mais recente com o operador de propagação es6 :
[...Array(30)].map(() => Math.random().toString(36)[2]).join('')
30
número é arbitrário, você pode escolher qualquer tamanho de token que desejar36
é o número máximo de radix que você pode passar para numeric.toString () , que significa todos os números e letras minúsculas de az2
é usado para escolher o 3º índice da sequência aleatória que se parece com isso"0.mfbiohx64i"
:, poderíamos pegar qualquer índice depois0.
fonte
fonte
while(s.length< L) s+= randomchar();
while(L--)
fará'A'.charCodeAt(0)
do que o mágico55
(e da mesma forma para o61
). Principalmente porque, na minha plataforma, o número mágico que retorna é65
. Esse código se auto-documentará melhor também.Gerador de cadeia aleatória (Alfa-numérico | Alfa | Numérico)
Enquanto o descrito acima usa verificações adicionais para a saída A / N, A, N desejada , vamos detalhar os itens essenciais (somente alfa-numérico) para uma melhor compreensão:
var str = "";
concatenar caracteres aleatóriosrand
número de índice de 0 a 61 (0..9 + A..Z + a..z = 62)rand
(já que é 0..61) incrementando-a em algum número (veja exemplos abaixo) para recuperar oCharCode
número certo e o caractere relacionado.str
umString.fromCharCode( incremented rand )
Vamos imaginar os intervalos da tabela de caracteres ASCII :
Math.floor( Math.random * 62 )
dá um intervalo de0..61
(o que precisamos).Vamos corrigir o aleatório para obter os intervalos corretos de charCode :
A lógica de operação condicional da tabela acima:
A partir da explicação acima, eis o snippet alfanumérico resultante :
Ou se você quiser:
fonte
A maneira mais simples é:
Isso gera seqüências aleatórias de 5 caracteres com base no horário atual. Saída de exemplo é
4mtxj
ou4mv90
ou4mwp1
O problema é que, se você chamá-lo duas vezes no mesmo segundo, ele gerará a mesma string.
A maneira mais segura é:
Isso gerará uma sequência aleatória de 4 ou 5 caracteres, sempre diferente. Saída de exemplo é como
30jzm
ou1r591
ou4su1a
Nos dois sentidos, a primeira parte gera um número aleatório. A
.toString(36)
peça converteu o número em uma representação base36 (alfadecimal) dela.fonte
(+new Date).toString(36)
(0|Math.random()*6.04e7).toString(36)
uma cobertura.(Math.random()*1e20).toString(36)
.Aqui estão alguns liners fáceis. mudança
new Array(5)
para definir o comprimento.Incluindo
0-9a-z
Incluindo
0-9a-zA-Z
fonte
Eu sei que todo mundo já entendeu direito, mas eu senti vontade de experimentar este da maneira mais leve possível (leve no código, não na CPU):
Demora um pouco para entender, mas acho que realmente mostra o quão impressionante é a sintaxe do javascript.
fonte
current = current ? current : '';
quando pode escrevercurrent = current || ''
;current || (current = '');
Se você estiver usando Lodash ou Underscore , é muito simples:
fonte
_.sampleSize('asdfgh',5).join('')
Para atender ao requisito [a-zA-Z0-9] e length = 5, use
Letras minúsculas, maiúsculas e números ocorrerão.
fonte
Caso alguém esteja interessado em uma linha (embora não esteja formatada como tal para sua conveniência) que aloque a memória de uma só vez (mas observe que, para pequenas cadeias de caracteres, isso realmente não importa), veja como fazê-lo:
Você pode substituir
5
pelo comprimento da string que deseja. Obrigado a @AriyaHidayat neste post pela solução damap
função que não está funcionando no array esparso criado porArray(5)
.fonte
Aqui está o método que eu criei.
Ele criará uma sequência contendo caracteres maiúsculos e minúsculos.
Além disso, incluí a função que também criará uma sequência alfanumérica.
Exemplos de trabalho:
http://jsfiddle.net/greatbigmassive/vhsxs/ (somente alfa)
http://jsfiddle.net/greatbigmassive/PJwg8/ (alfanumérico)
Atualização julho de 2015
Isso faz a mesma coisa, mas faz mais sentido e inclui todas as letras.
fonte
Supondo que você use underscorejs , é possível gerar elegantemente uma sequência aleatória em apenas duas linhas:
fonte
fonte
Algoritmo rápido e aprimorado. Não garante uniforme (ver comentários).
fonte
crypto.getRandomValues
retorna um dos 256 valores exclusivos. Como 256 não é dividido por 62, você acaba tendo uma probabilidade um pouco maior de obter caracteres AH. Acho que a melhor solução é fazer o que o YouTube fez e apenas adicionar 2 caracteres adicionais (possivelmente-
e_
) ao conjunto de caracteres. De qualquer forma, grande trabalho - esta resposta precisa de muito mais amor :)O problema com as respostas às perguntas "Preciso de seqüências aleatórias" (em qualquer idioma) é praticamente toda solução que utiliza uma especificação primária defeituosa do comprimento da string . As perguntas em si raramente revelam por que as strings aleatórias são necessárias, mas eu desafiaria que você raramente precise de strings aleatórias, digamos 8. O que você invariavelmente precisa é de um número de strings únicas , por exemplo, para usar como identificadores para algum propósito.
Existem duas maneiras principais de obter seqüências estritamente exclusivas : deterministicamente (o que não é aleatório) e armazenar / comparar (o que é oneroso). O que nós fazemos? Desistimos do fantasma. Em vez disso, optamos pela singularidade probabilística . Ou seja, aceitamos que haja algum risco (por menor que seja) que nossas cordas não sejam únicas. É aqui que se compreende a probabilidade de colisão e a entropia é útil.
Então, vou reformular a necessidade invariável, pois precisa de um certo número de strings com um pequeno risco de repetição. Como exemplo concreto, digamos que você queira gerar um potencial de 5 milhões de IDs. Você não deseja armazenar e comparar cada nova sequência e deseja que sejam aleatórias, portanto aceita alguns riscos de repetição. Como exemplo, digamos um risco de menos de 1 em um trilhão de chances de repetição. Então, qual o comprimento da corda que você precisa? Bem, essa pergunta é subespecificada, pois depende dos caracteres usados. Mais importante, porém, é equivocado. O que você precisa é de uma especificação da entropia das strings, não do seu comprimento. A entropia pode estar diretamente relacionada à probabilidade de repetição em algum número de strings. O comprimento da string não pode.
E é aqui que uma biblioteca como EntropyString pode ajudar. Para gerar IDs aleatórios com menos de 1 em um trilhão de chances de repetição em 5 milhões de strings usando
entropy-string
:entropy-string
usa um conjunto de caracteres com 32 caracteres por padrão. Existem outros conjuntos de caracteres predefinidos e você também pode especificar seus próprios caracteres. Por exemplo, gerando IDs com a mesma entropia acima, mas usando caracteres hexadecimais:Observe a diferença no comprimento da sequência devido à diferença no número total de caracteres no conjunto de caracteres usado. O risco de repetição no número especificado de sequências em potencial é o mesmo. Os comprimentos das strings não são. E o melhor de tudo, o risco de repetição e o número potencial de strings é explícito. Não há mais adivinhação com o comprimento da corda.
fonte
Isso é o mais limpo possível. Também é rápido, http://jsperf.com/ay-random-string .
fonte
strLength - 1
: - /--strLength
parastrLength--
corrigi-lo para mim.Você pode percorrer uma matriz de itens e adicioná-los recursivamente a uma variável de cadeia, por exemplo, se você quiser uma sequência aleatória de DNA:
fonte
Não encontrei uma solução limpa para suportar caracteres minúsculos e maiúsculos.
Suporte apenas em minúsculas:
Math.random().toString(36).substr(2, 5)
Com base nessa solução para suportar letras minúsculas e maiúsculas:
Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');
Altere o
5
insubstr(2, 5)
para ajustar o comprimento necessário.fonte
Um forro:
fonte
Array(15)
para um valor menor. Por exemplo:Array(4)
.Isso funciona com certeza
fonte
Que tal algo assim:
Date.now().toString(36)
não muito aleatório, mas curto e bastante único toda vez que você o chama.fonte
Date.now()
possui apenas uma resolução de milissegundos. Quando executado em um loop simples, por exemplo, você recebe muitas duplicatas.for (let i = 0; i < 10; ++i) { console.log(Date.now().toString(36)); }
.Caracteres alfanuméricos que não diferenciam maiúsculas de minúsculas:
O benefício desta função é que você pode obter uma sequência aleatória de comprimento diferente e garantir o comprimento da sequência.
Todos os caracteres sensíveis a maiúsculas e minúsculas:
Caracteres personalizados
fonte
var possible
like na resposta aceita, para que o resultado da função seja mais configurável.Gere uma sequência de 10 caracteres. O comprimento é definido pelo parâmetro (padrão 10).
fonte
Você pode usar coderain . É uma biblioteca para gerar códigos aleatórios de acordo com o padrão fornecido. Use
#
como um espaço reservado para caracteres maiúsculos e minúsculos, além de dígitos:Existem outros espaços reservados, como
A
para letras maiúsculas ou9
dígitos.O que pode ser útil é que chamar
.next()
sempre fornecerá um resultado exclusivo para que você não precise se preocupar com duplicatas.Aqui está um aplicativo de demonstração que gera uma lista de códigos aleatórios exclusivos .
Divulgação completa: sou o autor da coderain.
fonte