tipos - que es javascript
Crea un número único con tiempo de JavaScript (16)
Necesito generar números de identificación únicos sobre la marcha 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, 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 como esto: 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 una ID única?
Asumió que la solución propuesta por es una buena solución porque utiliza (new Date()).getTime()
para que tenga una ventana de milisegundos y sumar un tick
en caso de colisiones en este intervalo, podríamos considerar el uso de construcciones en lo que podemos ver claramente aquí en acción:
Puño, podemos ver aquí cómo puede haber colisiones en el marco de la ventana 1/1000 usando (new Date()).getTime()
:
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1155:1 1469615396590
VM1155:1 1469615396591
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1156:1 1469615398845
VM1156:1 1469615398846
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1158:1 1469615403045
VM1158:1 1469615403045
Segundo, probamos la solución propuesta que evita colisiones en la ventana 1/1000:
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
Dicho esto, podríamos considerar el uso de funciones como el nodo process.nextTick
que se llama en el ciclo de evento como un solo tick
y que está bien explicado here . Por supuesto, en el navegador no hay process.nextTick
así que tenemos que averiguar cómo hacerlo. This implementación instalará una función nextTick
en el navegador utilizando las funciones más cercanas a la E / S en el navegador que son setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. Como se sugiere here , podríamos agregar window.postMessage
, pero dejo esto al lector ya que también necesita addEventListener
. He modificado las versiones originales del módulo para que sea más simple aquí:
getUniqueID = (c => {
if(typeof(nextTick)==''undefined'')
nextTick = (function(window, prefixes, i, p, fnc) {
while (!fnc && i < prefixes.length) {
fnc = window[prefixes[i++] + ''equestAnimationFrame''];
}
return (fnc && fnc.bind(window)) || window.setImmediate || function(fnc) {window.setTimeout(fnc, 0);};
})(window, ''r webkitR mozR msR oR''.split('' ''), 0);
nextTick(() => {
return c( (new Date()).getTime() )
})
})
Entonces tenemos en la ventana 1/1000:
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966
De la investigación en línea, se me ocurrió el siguiente objeto que crea una identificación única por sesión:
window.mwUnique ={
prevTimeId : 0,
prevUniqueId : 0,
getUniqueID : function(){
try {
var d=new Date();
var newUniqueId = d.getTime();
if (newUniqueId == mwUnique.prevTimeId)
mwUnique.prevUniqueId = mwUnique.prevUniqueId + 1;
else {
mwUnique.prevTimeId = newUniqueId;
mwUnique.prevUniqueId = 0;
}
newUniqueId = newUniqueId + '''' + mwUnique.prevUniqueId;
return newUniqueId;
}
catch(e) {
mwTool.logError(''mwUnique.getUniqueID error:'' + e.message + ''.'');
}
}
}
Puede ser útil para algunas personas.
Aclamaciones
Andrés
En ES6:
const ID_LENGTH = 36
const START_LETTERS_ASCII = 97 // Use 64 for uppercase
const ALPHABET_LENGTH = 26
const uniqueID = () => [...new Array(ID_LENGTH)]
.map(() => String.fromCharCode(START_LETTERS_ASCII + Math.random() * ALPHABET_LENGTH))
.join('''')
Ejemplo:
> uniqueID()
> "bxppcnanpuxzpyewttifptbklkurvvetigra"
Esto crea un lado del cliente clave de 32 caracteres casi garantizado, si solo quiere que los números cambien la varilla de "caracteres".
var d = new Date().valueOf();
var n = d.toString();
var result = '''';
var length = 32;
var p = 0;
var chars = ''0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'';
for (var i = length; i > 0; --i){
result += ((i & 1) && n.charAt(p) ? ''<b>'' + n.charAt(p) + ''</b>'' : chars[Math.floor(Math.random() * chars.length)]);
if(i & 1) p++;
};
Esto debería hacer:
var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970
Esto es lo que hago cuando quiero algo más pequeño que un grupo de números: cambiar de base.
var uid = (new Date().getTime()).toString(36)
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/
Lo publiqué 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.
Esto se puede lograr simplemente con el siguiente código:
var date = new Date();
var components = [
date.getYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds()
];
var id = components.join("");
Esto también debería hacer:
(function() {
var uniquePrevious = 0;
uniqueId = function() {
return uniquePrevious++;
};
}());
La forma más corta de crear un número del que puede estar seguro será único en tantas instancias separadas como se pueda imaginar.
Date.now() + Math.random()
Si hay una diferencia de 1 milisegundo en la llamada a la función, se garantiza al 100% la generación de un número diferente . Para las llamadas a funciones dentro del mismo milisegundo, solo debería preocuparse si está creando más de unos pocos millones de números dentro de ese mismo milisegundo, lo que no es muy probable.
Para obtener más información sobre la probabilidad de obtener un número repetido dentro del mismo milisegundo, consulte https://.com/a/28220928/4617597
Publicando este fragmento de código aquí para mi futura referencia (no garantizado pero satisfactorio como "único"):
// a valid floating number
window.generateUniqueNumber = function() {
return new Date().valueOf() + Math.random();
};
// a valid HTML id
window.generateUniqueId = function() {
return "_" + new Date().valueOf() + Math.random().toFixed(16).substring(2);
};
Si solo quieres un número único, entonces
var timestamp = new Date().getUTCMilliseconds();
te daría un número simple Pero si necesita la versión legible, tendrá un poco de procesamiento:
var now = new Date();
timestamp = now.getFullYear().toString(); // 2011
timestamp += (now.getFullMonth < 9 ? ''0'' : '''') + now.getFullMonth().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()
Un mejor enfoque 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 .
usa esto: para crear un número único en javascript
var uniqueNumber=(new Date().getTime()).toString(36);
Realmente funciona. :)
yo suelo
Math.floor(new Date().valueOf() * Math.random())
Entonces, si por casualidad el código se activa al mismo tiempo, también hay una pequeña posibilidad de que los números aleatorios sean los mismos.
function UniqueValue(d){
var dat_e = new Date();
var uniqu_e = ((Math.random() *1000) +"").slice(-4)
dat_e = dat_e.toISOString().replace(/[^0-9]/g, "").replace(dat_e.getFullYear(),uniqu_e);
if(d==dat_e)
dat_e = UniqueValue(dat_e);
return dat_e;
}
Llamada 1: UniqueValue (''0'')
Call 2: UniqueValue (UniqueValue (''0'')) // será complejo
Muestra de salida:
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue (''0'')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804