Preciso gerar números de identificação exclusivos em tempo real usando javascript. No passado, eu fiz isso criando um número usando o tempo. O número seria composto de ano de quatro dígitos, mês de dois dígitos, dia de dois dígitos, hora de dois dígitos, minuto de dois dígitos, segundo de dois dígitos e milissegundos de três dígitos. Portanto, seria algo como: 20111104103912732 ... isso daria certeza suficiente de um número exclusivo para meus propósitos.
Já faz um tempo que não faço isso e não tenho mais o código. Alguém tem o código para fazer isso, ou tem uma sugestão melhor para gerar um ID único?
javascript
time
numbers
unique
Nick Petrie
fonte
fonte
new Date().toISOString ()
?Respostas:
Se você quer apenas um número único, então
obteria um número simples. Mas se precisar da versão legível, você precisará processar um pouco:
fonte
new Date().getTime();
odate.getUTCMilliseconds()
retorna um número entre 0 e 999.date.getTime()
retorna milissegundos desde 1º de janeiro de 1970. (carimbo de data / hora normal). w3schools.com/jsref/jsref_obj_date.aspfunction foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
The value returned by getUTCMilliseconds() is an integer between 0 and 999.
. Esta é a pior ideia para id único, o primeiro parágrafo deve ser removido.Uma abordagem melhor seria:
ao invés de
valueOf () é "provavelmente" um número exclusivo. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
fonte
+new Date()
valueOf()
. Acabei de usar isto -+performance.now().toString().replace('.', 7)
developer.mozilla.org/en-US/docs/Web/API/Performance/nowO caminho mais curto para criar um número que você pode ter certeza que será único entre tantas instâncias separadas quanto você possa imaginar é
Se houver uma diferença de 1 milissegundo na chamada da função, é 100% garantido gerar um número diferente . Para chamadas de função dentro do mesmo milissegundo, você só deve começar a se preocupar se estiver criando mais do que alguns milhões de números neste mesmo milissegundo, o que não é muito provável.
Para mais informações sobre a probabilidade de obter um número repetido no mesmo milissegundo, consulte https://stackoverflow.com/a/28220928/4617597
fonte
Isso pode ser alcançado simplesmente com o seguinte código:
fonte
Aqui está o que eu faço quando quero algo menor do que um monte de números - mudar a base.
fonte
(Date.now() + Math.random()).toString(36)
para evitar confrontos de milissegundos. É curto e gera algo como "k92g5pux.i36"Isso é executado mais rápido do que criar uma
Date
instância, usa menos código e sempre produzirá um número exclusivo (localmente):jsfiddle: http://jsfiddle.net/j8aLocan/
Eu lancei isso no Bower e npm: https://github.com/stevenvachon/unique-number
Você também pode usar algo mais elaborado como cuid , puid ou shortid para gerar um não-número.
fonte
eu uso
Portanto, se por acaso o código for disparado ao mesmo tempo, também haverá uma chance mínima de que os números aleatórios sejam os mesmos.
fonte
new Date()
é difícil útil. Você pode obter os mesmos números com duas datas diferentesMath.random()
?Isso deve fazer:
fonte
se você quiser um número único depois de alguns milis segundos, use
Date.now()
, se quiser usá-lo dentro de umfor loop
, use emDate.now() and Math.random()
conjuntonúmero único dentro de um loop for
saída: todos os números são únicos
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
número único sem
Math.random()
saída :: Números são repetidos
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
fonte
Investigando online, descobri o seguinte objeto que cria um id único por sessão:
Pode ser útil para algumas pessoas.
Felicidades
Andrew
fonte
Isso também deve fazer:
fonte
Em ES6:
Exemplo:
fonte
fonte
Em 2020, você pode usar a API Crypto no navegador para gerar valores aleatórios criptograficamente fortes.
tanto Uint8Array e Crypto.getRandomValues são suportados em todos os principais navegadores, incluindo IE11
fonte
Postando este snippet de código aqui para minha própria referência futura (não garantido, mas satisfatório "exclusivo" o suficiente):
fonte
Isso cria um lado do cliente chave exclusivo quase garantido de 32 caracteres, se você quiser apenas números, altere a var "chars".
https://jsfiddle.net/j0evrdf1/1/
fonte
use isto: para criar um número único em javascript
Realmente funciona. :)
fonte
Chamada 1: UniqueValue ('0')
Chamada 2: UniqueValue (UniqueValue ('0')) // será complexo
Exemplo de saída:
para (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804
fonte
Uma vez que os milissegundos não são atualizados a cada milissegundo no nó, a seguir está uma resposta. Isso gera um número de tíquete legível exclusivo. Eu sou novo em programação e nodejs. Por favor corrija-me se eu estiver errado.
}
}
fonte
Assumindo que a solução proposta por @abarber é uma boa solução porque usa
(new Date()).getTime()
por isso tem janelas de milissegundos e soma atick
em caso de colisões neste intervalo, poderíamos considerar o uso de built-in como podemos ver claramente aqui em ação:Em primeiro lugar, podemos ver aqui como pode haver colisões na moldura da janela 1/1000 usando
(new Date()).getTime()
:Em segundo lugar, tentamos a solução proposta que evita colisões na janela 1/1000:
Dito isso, poderíamos considerar o uso de funções como o nó
process.nextTick
que é chamado no loop de eventos como um únicotick
e está bem explicado aqui . É claro que no navegador não existe,process.nextTick
então temos que descobrir como fazer isso. Esta aplicação irá instalar umanextTick
função no navegador usando as funções mais mais perto do I / O no navegador que sãosetTimeout(fnc,0)
,setImmediate(fnc)
,window.requestAnimationFrame
. Como sugerido aqui , poderíamos adicionar owindow.postMessage
, mas deixo isso para o leitor, pois ele também precisa de umaddEventListener
. Modifiquei as versões originais do módulo para mantê-lo mais simples aqui:Portanto, temos na janela 1/1000:
fonte
Talvez ainda melhor seria usar getTime () ou valueOf (), mas dessa forma ele retorna um número único mais compreensível por humanos (representando data e hora):
fonte
fonte
Fácil e sempre obtenha um valor único:
fonte
Eu tenho feito assim
fonte
fonte
em referência à solução #Marcelo Lazaroni acima
retorna um número como este 1567507511939.4558 (limitado a 4 decimais) e fornecerá números não exclusivos (ou colisões) a cada 0,1%.
adicionar toString () corrige isso
Date.now() + Math.random().toString()
retorna '15675096840820.04510962122198503' (uma string) e é tão 'lento' que você nunca obtém o 'mesmo' milissegundo, de qualquer maneira.
fonte
fonte
Usando
toString(36)
, ligeiramente lento, aqui está a solução mais rápida e exclusiva:fonte
Para obter um número único:
Exemplo:
você pode alterar o comprimento usando:
fonte
100% garantido para gerar um número diferente ...
fonte