function generate(count) {
var founded = false,
_sym = 'abcdefghijklmnopqrstuvwxyz1234567890',
str = '';
while(!founded) {
for(var i = 0; i < count; i++) {
str += _sym[parseInt(Math.random() * (_sym.length))];
}
base.getID(string, function(err, res) {
if(!res.length) {
founded = true; // How to do it?
}
});
}
return str;
}
¿Cómo establecer un valor variable con devolución de llamada de consulta de base de datos? ¿Cómo puedo hacerlo?
javascript
node.js
express
búho
fuente
fuente
var hexstring = crypto.randomBytes(16).toString("hex");
seguido devar guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
new mongo.ObjectID();
y stackoverflow.com/a/56106999/4701635Respuestas:
Ha pasado algún tiempo desde que usé node.js, pero creo que podría ayudarlo.
En primer lugar, en el nodo, solo tiene un solo subproceso y se supone que debe usar devoluciones de llamada. Lo que sucederá con su código es que la
base.getID
consulta se pondrá en cola para su ejecución, pero elwhile
bucle se ejecutará continuamente como un bucle ocupado sin sentido.Debería poder resolver su problema con una devolución de llamada de la siguiente manera:
Y úsalo como tal
No he codificado ningún nodo / js en alrededor de 2 años y no lo he probado, pero la idea básica debería ser válida: no use un bucle ocupado y use devoluciones de llamada. Es posible que desee echar un vistazo al paquete asíncrono de nodo.
fuente
Instale el paquete uuid NPM (fuentes: https://github.com/kelektiv/node-uuid ):
y úsalo en tu código:
Luego crea algunos identificadores ...
** ACTUALIZACIÓN 3.1.0
El uso anterior está en desuso , así que use este paquete así:
** ACTUALIZACIÓN 7.x
Y ahora el uso anterior también está en desuso , así que use este paquete así:
fuente
La forma más rápida posible de crear una cadena aleatoria de 32 caracteres en Node es mediante el uso del
crypto
módulo nativo :fuente
crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
crypto
ahora está integrado en el propio nodo. Recibirá esta advertencia si npm lo instala:[email protected]: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in
Otro enfoque utiliza el ShortID paquete de NPM.
Es muy fácil de usar:
y tiene algunas características atractivas:
fuente
node-uuid
está en desuso, así que por favor useuuid
Enlace Npm
fuente
Simple, basado en el tiempo, sin dependencias:
Salida:
jzlatihl
más número aleatorio (Gracias a la respuesta de @Yaroslav Gaponov)
Salida
jzlavejjperpituute
fuente
Más fácil y sin módulos adicionales
fuente
function getId(mask) { return mask.replace(/[x]/gi, () => { return Math.random().toString(26)[5]; }) } console.log(getId('xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'));
random_numbers = [] for (i = 0; i < 1000000; i++) { random_numbers.push(Math.random()) } if (i === 1000000) { console.log("Before checking duplicate") console.log(random_numbers.length) console.log("After checking duplicate") random_set = new Set(random_numbers) console.log([...random_set].length) }
Si alguien necesita un UUID criptográfico fuerte, también hay una solución para eso.
https://www.npmjs.com/package/generate-safe-id
fuente
generate-safe-id
abandono Y a que no se corrigieron las vulnerabilidades de seguridad (a partir de agosto de 2018)Estoy usando lo siguiente y funciona bien y sin dependencias de terceros.
fuente
Las soluciones aquí son antiguas y ahora están en desuso: https://github.com/uuidjs/uuid#deep-requires-now-deprecated
Utilizar este:
fuente
https://www.npmjs.com/package/uniqid usado en npm
Siempre creará identificaciones únicas basadas en la hora actual, el proceso y el nombre de la máquina.
Caracteristicas:-
fuente
instalar uuid
uuid se actualiza y la importación anterior
no funciona y ahora deberíamos usar esta importación
y para usarlo use como una función como esta =>
fuente
Extendiéndose de la respuesta de YaroslavGaponov , la implementación más simple es simplemente usar
Math.random()
.Las posibilidades de que las fracciones sean las mismas en un espacio real [0, 1] es teóricamente 0 y aproximadamente cercano a 0 para una longitud predeterminada de 16 decimales en node.js. Y esta implementación también debería reducir los desbordamientos aritméticos ya que no se realizan operaciones. Además, es más eficiente en la memoria en comparación con una cadena, ya que los decimales ocupan menos memoria que las cadenas.
Yo llamo a esto el "ID-Chong-Fractional-Unique" . Todavía no he escrito un documento sobre sus propiedades, que espero poder leer pronto.
Escribió un código para generar 1,000,000 de
Math.random()
números y no pudo encontrar ningún duplicado (al menos para los puntos decimales predeterminados de 16). Vea el código a continuación (proporcione comentarios si los hay):fuente
random_numbers.push(Math.random().toFixed(13))
todavía dan la misma duración