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;
}
Wie setze ich einen Variablenwert mit einem Datenbankabfrage-Rückruf? Wie kann ich es tun?
javascript
node.js
express
Eule
quelle
quelle
var hexstring = crypto.randomBytes(16).toString("hex");
var guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
new mongo.ObjectID();
und manuell stackoverflow.com/a/56106999/4701635Antworten:
Es ist einige Zeit her, dass ich node.js verwendet habe, aber ich denke, ich kann vielleicht helfen.
Erstens haben Sie im Knoten nur einen einzigen Thread und sollten Rückrufe verwenden. Was mit Ihrem Code passieren wird, ist, dass die
base.getID
Abfrage zur Ausführung in diewhile
Warteschlange gestellt wird , die Schleife jedoch weiterhin sinnlos als Besetztschleife ausgeführt wird.Sie sollten in der Lage sein, Ihr Problem mit einem Rückruf wie folgt zu lösen:
Und benutze es als solches
Ich habe seit ungefähr 2 Jahren keinen Knoten / js mehr codiert und dies nicht getestet, aber die Grundidee sollte gelten - verwenden Sie keine Besetztschleife und verwenden Sie Rückrufe. Vielleicht möchten Sie sich das asynchrone Paket des Knotens ansehen.
quelle
Installieren Sie das NPM- UUID- Paket (Quellen: https://github.com/kelektiv/node-uuid ):
und verwenden Sie es in Ihrem Code:
Dann erstelle ein paar IDs ...
** UPDATE 3.1.0
Die oben genannte Verwendung ist veraltet . Verwenden Sie dieses Paket also wie folgt :
** UPDATE 7.x
Und jetzt ist auch die oben genannte Verwendung veraltet. Verwenden Sie dieses Paket also wie folgt :
quelle
Der schnellstmögliche Weg, um eine zufällige Zeichenfolge mit 32 Zeichen in Node zu erstellen, ist die Verwendung des nativen
crypto
Moduls:quelle
crypto.randomBytes(3*4).toString('base64') //=> '9uzHqCOWI9Kq2Jdw'
crypto
ist jetzt in den Knoten selbst eingebaut. Sie erhalten diese Warnung, wenn Sie es npm installieren:[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
Ein anderer Ansatz ist die Verwendung des Shortid- Pakets von npm.
Es ist sehr einfach zu bedienen:
und hat einige überzeugende Eigenschaften:
quelle
node-uuid
ist veraltet, bitte verwendenuuid
Npm Link
quelle
Einfach, zeitbasiert, ohne Abhängigkeiten:
Ausgabe:
jzlatihl
plus Zufallszahl (Dank der Antwort von @Yaroslav Gaponov)
Ausgabe
jzlavejjperpituute
quelle
Einfacher und ohne Zusatzmodule
quelle
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) }
Wenn jemand eine kryptografisch starke UUID benötigt, gibt es auch dafür eine Lösung.
https://www.npmjs.com/package/generate-safe-id
quelle
generate-safe-id
sie aufgegeben wurden UND Sicherheitslücken nicht behoben wurden (Stand August 2018)Ich verwende Folgendes und es funktioniert einwandfrei und ohne Abhängigkeiten von Drittanbietern.
quelle
Die Lösungen hier sind alt und jetzt veraltet: https://github.com/uuidjs/uuid#deep-requires-now-deprecated
Benutze das:
quelle
verwendet https://www.npmjs.com/package/uniqid in npm
Es werden immer eindeutige IDs basierend auf der aktuellen Zeit, dem aktuellen Prozess und dem Computernamen erstellt.
Eigenschaften:-
quelle
um uuid zu installieren
uuid wird aktualisiert und der alte Import
funktioniert nicht und wir sollten jetzt diesen Import verwenden
und für die Verwendung als Funktion wie diese verwenden =>
quelle
Ausgehend von YaroslavGaponovs Antwort ist die einfachste Implementierung nur die Verwendung
Math.random()
.Die Wahrscheinlichkeit, dass Brüche in einem realen Raum gleich sind [0, 1], ist theoretisch 0 und ungefähr nahe 0 für eine Standardlänge von 16 Dezimalstellen in node.js. Diese Implementierung sollte auch arithmetische Überläufe reduzieren, da keine Operationen ausgeführt werden. Außerdem ist es speichereffizienter als eine Zeichenfolge, da Dezimalstellen weniger Speicher belegen als Zeichenfolgen.
Ich nenne das die "Chong-Fractional-Unique-ID" . Ich habe noch kein Papier über seine Eigenschaften geschrieben, das ich hoffentlich bald erreichen werde.
Schrieb Code, um 1.000.000
Math.random()
Zahlen zu generieren , und konnte keine Duplikate finden (zumindest für Standard-Dezimalstellen von 16). Siehe Code unten (bitte geben Sie gegebenenfalls Feedback):quelle
random_numbers.push(Math.random().toFixed(13))
immer noch die gleiche Länge ergeben