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;
}
Como definir um valor variável com retorno de chamada da consulta ao banco de dados? Como posso fazer isso?
javascript
node.js
express
coruja
fonte
fonte
var hexstring = crypto.randomBytes(16).toString("hex");
seguido porvar guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
new mongo.ObjectID();
e manualmente stackoverflow.com/a/56106999/4701635Respostas:
Já faz algum tempo desde que usei o node.js, mas acho que posso ajudar.
Primeiramente, no nó, você tem apenas um único encadeamento e deve usar retornos de chamada. O que acontecerá com o seu código é que a
base.getID
consulta será enfileirada para execução, mas owhile
loop será executado continuamente como um loop ocupado sem sentido.Você poderá resolver seu problema com um retorno de chamada da seguinte maneira:
E use-o como tal
Eu não codifiquei nenhum nó / js em cerca de 2 anos e não testei isso, mas a idéia básica deve se manter - não use um loop ocupado e use retornos de chamada. Você pode querer dar uma olhada no pacote assíncrono do nó.
fonte
Instale o pacote do NPM uuid (fontes: https://github.com/kelektiv/node-uuid ):
e use-o no seu código:
Em seguida, crie alguns IDs ...
** ATUALIZAÇÃO 3.1.0
O uso acima foi preterido , portanto, use este pacote como este:
** UPDATE 7.x
E agora o uso acima também foi preterido , portanto, use este pacote como este:
fonte
A maneira mais rápida possível de criar uma seqüência aleatória de 32 caracteres no Node é usando o
crypto
módulo nativo :fonte
crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
crypto
agora está embutido no próprio nó. Você recebe esse aviso se o npm o instalar:[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
Outra abordagem é usar o ShortID pacote do NPM.
É muito fácil de usar:
e possui alguns recursos atraentes:
fonte
node-uuid
está obsoleto, então useuuid
Link Npm
fonte
Simples, baseado em tempo, sem dependências:
Resultado:
jzlatihl
mais número aleatório (Graças à resposta de @Yaroslav Gaponov)
Resultado
jzlavejjperpituute
fonte
Módulos mais fáceis e sem adição
fonte
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) }
Se alguém precisar de um UUID com forte criptografia, também há solução para isso.
https://www.npmjs.com/package/generate-safe-id
fonte
generate-safe-id
ser abandonado e vulnerabilidades de segurança não fixada (em agosto de 2018)Estou usando o seguinte e ele está funcionando bem e sem dependências de terceiros.
fonte
As soluções aqui são antigas e agora estão obsoletas: https://github.com/uuidjs/uuid#deep-requires-now-deprecated
Usa isto:
fonte
usado https://www.npmjs.com/package/uniqid no npm
Ele sempre criará IDs exclusivos com base no horário atual, no processo e no nome da máquina.
Recursos:-
fonte
instalar uuid
uuid é atualizado e a importação antiga
não está funcionando e agora devemos usar essa importação
e para usá-lo use como uma função como esta =>
fonte
Estendendo-se da resposta de YaroslavGaponov , a implementação mais simples é apenas usar
Math.random()
.As chances de frações serem as mesmas em um espaço real [0, 1] são teoricamente 0 e aproximadamente próximas a 0 para um comprimento padrão de 16 casas decimais em node.js. E essa implementação também deve reduzir estouros aritméticos, pois nenhuma operação é executada. Além disso, é mais eficiente em termos de memória em comparação com uma string, pois os decimais ocupam menos memória que as strings.
Eu chamo isso de "Chong-Fractional-Unique-ID" . Ainda não escrevi um artigo sobre suas propriedades, que espero chegar em breve.
Escreveu código para gerar 1.000.000 de
Math.random()
números e não conseguiu encontrar duplicatas (pelo menos para pontos decimais padrão de 16). Veja o código abaixo (forneça feedback, se houver):fonte
random_numbers.push(Math.random().toFixed(13))
ainda dão o mesmo comprimento