Búsqueda de sitios web

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

Artículos relacionados