Crear un número único con el tiempo de JavaScript
Necesito generar números de identificación únicos al instante usando JavaScript. En el pasado, he hecho esto creando un número usando el tiempo. El número estaría compuesto por el año de cuatro dígitos, mes de dos dígitos, día de dos dígitos, hora de dos dígitos, minuto de dos dígitos, segundo de dos dígitos y milisegundo de tres dígitos. Así que 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 mejor sugerencia para generar un ID único?
Respuesta #1
La forma más corta de crear un número del que puedes estar bastante seguro de que será único entre tantos casos separados como puedas imaginar es
Date.now() + Math.random()
Si hay una diferencia de 1 milisegundo en la llamada a la función, está 100% garantizado que generará un número diferente. Para llamadas a la función dentro del mismo milisegundo, solo deberías empezar a preocuparte si estás creando más de unos pocos millones de números dentro de ese mismo milisegundo, lo cual no es muy probable.
Para más información sobre la probabilidad de obtener un número repetido dentro del mismo milisegundo, consulte https://stackoverflow.com/a/28220928/4617597
Respuesta #2
Un enfoque mejor sería:
new Date().valueOf();
en lugar de
new Date().getUTCMilliseconds();
valueOf() es "muy probablemente" un número único. http://www.w3schools.com/jsref/jsref_valueof_date.asp.
Respuesta #3
Si solo quieres un número algo único, entonces
var timestamp = new Date().getUTCMilliseconds();
te daría un número simple. Pero si necesitas la versión legible, tendrás que hacer un poco de procesamiento:
var now = new Date();
timestamp = now.getFullYear().toString(); // 2011
timestamp += (now.getMonth < 9 ? '0' : '') + now.getMonth().toString(); // JS months are 0-based, so +1 and pad with 0's
timestamp += ((now.getDate < 10) ? '0' : '') + now.getDate().toString(); // pad with a 0
... etc... with .getHours(), getMinutes(), getSeconds(), getMilliseconds()
Respuesta #4
Esto es lo que hago cuando quiero algo más pequeño que un montón de números: cambiar de base.
var uid = (new Date().getTime()).toString(36)
Respuesta #5
Yo uso
Math.floor(new Date().valueOf() * Math.random())
Así que, si por casualidad el código se ejecuta al mismo tiempo, también hay una pequeña posibilidad de que los números aleatorios sean los mismos.
Respuesta #6
Esto funciona más rápido que crear una instancia de Date, usa menos código y siempre producirá un número único (localmente):
function uniqueNumber() {
var date = Date.now();
// If created at same millisecond as previous
if (date <= uniqueNumber.previous) {
date = ++uniqueNumber.previous;
} else {
uniqueNumber.previous = date;
}
return date;
}
uniqueNumber.previous = 0;
jsfiddle: http://jsfiddle.net/j8aLocan/
He publicado esto en Bower y npm: https://github.com/stevenvachon/unique-number
También podrías usar algo más elaborado como cuid, puid o shortid para generar un no-número.
Respuesta #7
En 2024, puedes usar la API de Crypto en el navegador para generar valores aleatorios criptográficamente seguros.
function getRandomNumbers() {
const typedArray = new Uint8Array(10);
const randomValues = window.crypto.getRandomValues(typedArray);
return randomValues.join('');
}
console.log(getRandomNumbers());
// 1857488137147725264738
function getRandomNumbers() {
const typedArray = new Uint8Array(10);
const randomValues = window.crypto.getRandomValues(typedArray);
return randomValues.join('');
}
console.log(getRandomNumbers());tanto el constructor Uint8Array como Crypto.getRandomValues son compatibles con todos los principales navegadores, incluido IE11
Respuesta #8
Esto debería servir :
var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970
