Necesito generar números de identificación únicos sobre la marcha usando javascript. En el pasado, hice esto creando un número usando el tiempo. El número estaría compuesto por el año de cuatro dígitos, el mes de dos dígitos, el día de dos dígitos, la hora de dos dígitos, el minuto de dos dígitos, el segundo de dos dígitos y el milisegundo de tres dígitos. Entonces se vería algo así: 20111104103912732 ... esto daría suficiente certeza de un número único para mis propósitos.
Ha pasado un tiempo desde que hice esto y ya no tengo el código. ¿Alguien tiene el código para hacer esto o tiene una sugerencia mejor para generar una identificación única?
javascript
time
numbers
unique
Nick Petrie
fuente
fuente
new Date().toISOString ()
?Respuestas:
Si solo desea un número único, entonces
le daría un número simple. Pero si necesita la versión legible, le espera un poco de procesamiento:
fuente
new Date().getTime();
el quedate.getUTCMilliseconds()
devuelve un número entre 0 y 999.date.getTime()
Devuelve milisegundos desde el 1 de enero de 1970 (marca de tiempo 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 es la peor idea para una identificación única, el primer párrafo debe eliminarse.Un mejor enfoque sería:
en vez de
valueOf () es "muy probablemente" un número único. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
fuente
+new Date()
valueOf()
. Solo uso esto:+performance.now().toString().replace('.', 7)
developer.mozilla.org/en-US/docs/Web/API/Performance/nowLa forma más corta de crear un número del que puede estar bastante seguro será único entre tantas instancias separadas como pueda imaginar es
Si hay una diferencia de 1 milisegundo en la llamada de función, está 100% garantizado para generar un número diferente . Para llamadas de función dentro del mismo milisegundo, solo debería comenzar a preocuparse si está creando más de unos pocos millones de números dentro de este mismo milisegundo, lo cual no es muy probable.
Para obtener más información sobre la probabilidad de obtener un número repetido en el mismo milisegundo, consulte https://stackoverflow.com/a/28220928/4617597
fuente
Esto se puede lograr simplemente con el siguiente código:
fuente
Esto es lo que hago cuando quiero algo más pequeño que un montón de números: cambiar de base.
fuente
(Date.now() + Math.random()).toString(36)
para evitar choques de milisegundos. Es breve y genera algo como "k92g5pux.i36"Esto funciona más rápido que crear una
Date
instancia, usa menos código y siempre producirá un número único (localmente):jsfiddle: http://jsfiddle.net/j8aLocan/
He publicado esto en Bower y npm: https://github.com/stevenvachon/unique-number
También puede usar algo más elaborado como cuid , puid o shortid para generar un no número.
fuente
yo suelo
Entonces, si por casualidad el código se dispara al mismo tiempo, también hay una pequeña posibilidad de que los números aleatorios sean los mismos.
fuente
new Date()
es útil. Puede obtener los mismos números con dos fechas diferentesMath.random()
?Esto debería hacer:
fuente
si desea un número único después de unos mili segundos, úselo
Date.now()
, si desea usarlo dentro de unfor loop
, úseloDate.now() and Math.random()
juntosnúmero único dentro de un bucle for
salida :: todos los números son únicos
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
número único sin
Math.random()
salida :: Los números se repiten
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
fuente
Al investigar en línea, se me ocurrió el siguiente objeto que crea una identificación única por sesión:
Quizás sea útil para algunas personas.
Salud
Andrés
fuente
Esto también debería hacer:
fuente
En ES6:
Ejemplo:
fuente
fuente
En 2020, puede utilizar la API de cifrado en el navegador para generar valores aleatorios criptográficamente fuertes.
tanto Uint8Array como Crypto.getRandomValues son compatibles con los principales navegadores, incluido IE11
fuente
Publicando este fragmento de código aquí para mi propia referencia futura (no garantizado, pero suficientemente "único" satisfactorio):
fuente
Esto crea un lado del cliente clave único casi garantizado de 32 caracteres, si solo desea que los números cambien la var "chars".
https://jsfiddle.net/j0evrdf1/1/
fuente
use esto: para crear un número único en javascript
Realmente funciona. :)
fuente
Llamada 1: UniqueValue ('0')
Llamada 2: UniqueValue (UniqueValue ('0')) // será compleja
Salida de muestra:
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804
fuente
Dado que los milisegundos no se actualizan cada milisegundo en el nodo, la siguiente es una respuesta. Esto genera un número de ticket único legible por humanos. Soy nuevo en programación y nodejs. Por favor, corríjame si estoy equivocado.
}
}
fuente
Suponiendo que la solución propuesta por @abarber es una buena solución porque usa
(new Date()).getTime()
por lo que tiene ventanas de milisegundos y suma atick
en caso de colisiones en este intervalo, podríamos considerar el uso de built-in como podemos ver claramente aquí en acción:Primero, podemos ver aquí cómo puede haber colisiones en el marco de la ventana 1/1000 usando
(new Date()).getTime()
:En segundo lugar, probamos la solución propuesta que evita colisiones en la ventana 1/1000:
Dicho esto, podríamos considerar usar funciones como el nodo
process.nextTick
que se llama en el bucle de eventos como un solotick
y está bien explicado aquí . Por supuesto, en el navegador no hay,process.nextTick
así que tenemos que averiguar cómo hacerlo. Esta aplicación se instalará unanextTick
función en el navegador usando las mayoría de las funciones más cerca de la E / S en el navegador que sonsetTimeout(fnc,0)
,setImmediate(fnc)
,window.requestAnimationFrame
. Como se sugiere aquí , podríamos agregar elwindow.postMessage
, pero se lo dejo al lector ya que también necesita unaddEventListener
. He modificado las versiones originales del módulo para que sea más simple aquí:Entonces tenemos en la ventana 1/1000:
fuente
Quizás incluso mejor sería usar getTime () o valueOf (), pero de esta manera devuelve un número único más comprensible para humanos (que representa la fecha y la hora):
fuente
fuente
Fácil y siempre obtenga un valor único:
fuente
Lo he hecho de esta manera
fuente
fuente
en referencia a la solución #Marcelo Lazaroni anterior
devuelve un número como este 1567507511939.4558 (limitado a 4 decimales) y dará números no únicos (o colisiones) cada 0,1%.
agregar toString () corrige esto
Date.now() + Math.random().toString()
devuelve '15675096840820.04510962122198503' (una cadena), y es además tan 'lento' que nunca obtienes el 'mismo' milisegundo, de todos modos.
fuente
fuente
Usando
toString(36)
, un poco lento, aquí está la solución más rápida y única:fuente
Para obtener un número único:
Ejemplo:
puedes cambiar la longitud usando:
fuente
100% garantizado para generar un número diferente ...
fuente