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;
}
Jak ustawić wartość zmiennej z wywołaniem zwrotnym zapytania do bazy danych? Jak mogę to zrobić?
javascript
node.js
express
sowa
źródło
źródło
var hexstring = crypto.randomBytes(16).toString("hex");
następnievar guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
new mongo.ObjectID();
ręcznym stackoverflow.com/a/56106999/4701635Odpowiedzi:
Minęło trochę czasu, odkąd użyłem node.js, ale myślę, że mógłbym pomóc.
Po pierwsze, w węźle masz tylko jeden wątek i powinieneś używać wywołań zwrotnych. To, co stanie się z twoim kodem, to to, że
base.getID
zapytanie zostanie umieszczone w kolejce do wykonania, alewhile
pętla będzie bezcelowo działać jako zajęta pętla.Powinieneś być w stanie rozwiązać swój problem za pomocą oddzwonienia w następujący sposób:
I używaj go jako takiego
Nie kodowałem żadnego węzła / js od około 2 lat i nie testowałem tego, ale podstawowy pomysł powinien się utrzymać - nie używaj zajętej pętli i używaj wywołań zwrotnych. Możesz rzucić okiem na pakiet asynchroniczny węzła.
źródło
Zainstaluj pakiet NPM uuid (źródła: https://github.com/kelektiv/node-uuid ):
i użyj go w swoim kodzie:
Następnie utwórz kilka identyfikatorów ...
** UPDATE 3.1.0
Powyższe użycie jest przestarzałe , więc użyj tego pakietu w następujący sposób:
** UPDATE 7.x
A teraz powyższe użycie również jest przestarzałe , więc użyj tego pakietu w następujący sposób:
źródło
Najszybszym możliwym sposobem utworzenia losowego 32-znakowego ciągu w Node jest użycie
crypto
modułu natywnego :źródło
crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
crypto
jest teraz wbudowany w sam węzeł .. Otrzymasz to ostrzeżenie, jeśli zainstalujesz go npm:[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
Innym podejściem jest użycie shortid pakietu z npm.
Jest bardzo łatwy w użyciu:
i ma kilka atrakcyjnych funkcji:
źródło
node-uuid
jest przestarzały, więc użyjuuid
Link NPM
źródło
Proste, oparte na czasie, bez zależności:
Wynik:
jzlatihl
plus liczba losowa (dzięki odpowiedzi @Yaroslav Gaponov)
Wynik
jzlavejjperpituute
źródło
Łatwiej i bez dodatkowych modułów
źródło
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) }
Jeśli ktoś potrzebuje identyfikatora UUID o silnym działaniu kryptograficznym, jest na to również rozwiązanie.
https://www.npmjs.com/package/generate-safe-id
źródło
generate-safe-id
porzucenia ORAZ luki w zabezpieczeniach nie zostały naprawione (stan na sierpień 2018)Używam następujących i działa dobrze i bez żadnych zależności innych firm.
źródło
Rozwiązania tutaj są stare i teraz przestarzałe: https://github.com/uuidjs/uuid#deep-requires-now-deprecated
Użyj tego:
źródło
używany https://www.npmjs.com/package/uniqid w npm
Zawsze tworzy unikalne identyfikatory na podstawie aktualnego czasu, procesu i nazwy maszyny.
Cechy:-
źródło
zainstalować uuid
uuid zostanie zaktualizowany, a stary import
nie działa i powinniśmy teraz użyć tego importu
i aby go używać użyj jako funkcji takiej jak ta =>
źródło
Wychodząc od odpowiedzi Jarosława Gaponowa, najprostszą implementacją jest po prostu użycie
Math.random()
.Szanse, że ułamki będą takie same w przestrzeni rzeczywistej [0, 1] teoretycznie wynoszą 0 i w przybliżeniu bliskie 0 dla domyślnej długości 16 miejsc po przecinku w node.js. Ta implementacja powinna również zmniejszyć przepełnienia arytmetyczne, ponieważ nie są wykonywane żadne operacje. Ponadto jest bardziej wydajna w pamięci w porównaniu do ciągu, ponieważ liczby dziesiętne zajmują mniej pamięci niż ciągi.
Nazywam to „Chong-Ułamkowym-Unikalnym-ID” . Nie napisałem jeszcze artykułu o jego właściwościach, który mam nadzieję, że niedługo się do niego zabiorę.
Napisałem kod generujący 1000000
Math.random()
liczb i nie mogłem znaleźć żadnych duplikatów (przynajmniej dla domyślnych miejsc dziesiętnych 16). Zobacz kod poniżej (prześlij opinię, jeśli taka istnieje):źródło
random_numbers.push(Math.random().toFixed(13))
nadal daje tę samą długość