Dies ist die schnellste GUID-ähnliche String-Generatormethode im Format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
. Es wird keine standardkonforme GUID erzeugt.
Zehn Millionen Durchläufe dieser Implementierung dauern nur 32,5 Sekunden, was die schnellste Zeit ist, die ich je in einem Browser gesehen habe (die einzige Lösung ohne Schleifen/Wiederholungen).
Die Funktion ist so einfach wie:
/**
* Generates a GUID string.
* @returns {string} The generated GUID.
* @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa
* @author Slavik Meltser.
* @link http://slavik.meltser.info/?p=142
*/
function guid() {
function _p8(s) {
var p = (Math.random().toString(16)+"000000000").substr(2,8);
return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ;
}
return _p8() + _p8(true) + _p8(true) + _p8();
}
Um die Leistung zu testen, können Sie diesen Code ausführen:
console.time('t');
for (var i = 0; i < 10000000; i++) {
guid();
};
console.timeEnd('t');
Ich bin mir sicher, dass die meisten von Ihnen verstehen werden, was ich da gemacht habe, aber vielleicht gibt es wenigstens eine Person, die eine Erklärung braucht:
Der Algorithmus:
- El
Math.random()
Funktion gibt eine Dezimalzahl zwischen 0 und 1 mit 16 Stellen nach dem Dezimalpunkt zurück (für Beispiel 0.4363923368509859
).
- Dann nehmen wir diese Zahl und wandeln sie um in eine Zeichenkette zur Basis 16 um (im obigen Beispiel erhalten wir
0.6fb7687f
). Math.random().toString(16)
.
- Dann schneiden wir die
0.
Präfix ( 0.6fb7687f
=> 6fb7687f
) und erhalten eine Zeichenkette mit acht hexadezimalen Zeichen lang. (Math.random().toString(16).substr(2,8)
.
- Manchmal ist die
Math.random()
Funktion wird zurückgegeben eine kürzere Zahl (zum Beispiel 0.4363
), wegen der Nullen am Ende (im obigen Beispiel ist die Zahl eigentlich 0.4363000000000000
). Deshalb füge ich an diese Zeichenfolge an "000000000"
(eine Zeichenkette mit neun Nullen) und schneidet sie dann ab mit substr()
damit es genau neun Zeichen sind (mit Nullen nach rechts).
- Der Grund für die Hinzufügung von genau neun Nullen ist das Worst-Case-Szenario, d. h., wenn die
Math.random()
Funktion wird genau 0 oder 1 zurückgeben (Wahrscheinlichkeit von 1/10^16 für jeden von ihnen). Deshalb mussten wir neun Nullen anfügen ( "0"+"000000000"
o "1"+"000000000"
) und schneidet ihn dann ab dem zweiten Index (drittes Zeichen) mit einer Länge von acht Zeichen ab. In den übrigen Fällen wird das Ergebnis durch das Hinzufügen von Nullen nicht beeinträchtigt, da es ohnehin abgeschnitten wird. Math.random().toString(16)+"000000000").substr(2,8)
.
Die Versammlung:
- Die GUID hat das folgende Format
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
.
- Ich habe die GUID in vier Teile aufgeteilt, wobei jeder Teil in zwei Typen (oder Formate) unterteilt ist:
XXXXXXXX
y -XXXX-XXXX
.
- Jetzt baue ich die GUID mit diesen beiden Typen wie folgt auf, um die GUID mit vier Teilen zusammenzusetzen:
XXXXXXXX
-XXXX-XXXX
-XXXX-XXXX
XXXXXXXX
.
- Um zwischen diesen beiden Typen zu unterscheiden, habe ich einen Flag-Parameter zu einer Paarerstellungsfunktion hinzugefügt
_p8(s)
die s
teilt der Funktion mit, ob Bindestriche hinzugefügt werden sollen oder nicht.
- Schließlich bilden wir die GUID mit der folgenden Verkettung:
_p8() + _p8(true) + _p8(true) + _p8()
und geben Sie es zurück.
Link zu diesem Beitrag in meinem Blog
Viel Spaß! :-)
38 Stimmen
GUIDs, die als Zeichenketten dargestellt werden, sind mindestens 36 und höchstens 38 Zeichen lang und entsprechen dem Muster ^\{?[a-zA-Z0-9]{36}?\}$ und sind daher immer in ASCII.
5 Stimmen
David Bau bietet einen viel besseren Zufallszahlengenerator an, der unter davidbau.com/archives/2010/01/30/ Ich habe einen etwas anderen Ansatz zur Erzeugung von UUIDs unter blogs.cozi.com/tech/2010/04/generating-uuids-in-javascript.html
1 Stimmen
Seltsam, dass das noch niemand erwähnt hat, aber der Vollständigkeit halber: Es gibt eine Fülle von guid-Generatoren auf npm Ich wette, die meisten von ihnen funktionieren auch im Browser.
1 Stimmen
Wenn jemand mehr Optionen wie verschiedene Versionen der uuid und Unterstützung für nicht standardmäßige guids wünscht, können REST-basierte uuid-Generierungsdienste wie diese [ fungenerators.com/api/uuid ] sind ebenfalls eine attraktive Option.
2 Stimmen
Etwa 12 Jahre später mit
BigInt
und ES6-Klassen können auch andere Techniken eingesetzt werden, die Raten von 500.000 uuid/sec ermöglichen. Siehe Referenz5 Stimmen
Comme andere haben erwähnt Wenn Sie nur eine kleine Anzahl von UUIDs in einem Browser erzeugen, verwenden Sie einfach
URL.createObjectURL(new Blob()).substr(-36)
. ( Ausgezeichnete Browser-Unterstützung ). (Um Speicherlecks zu vermeiden, URL.revokeObjectURL(url) aufrufen )1 Stimmen
Wenn Sie ein unternehmenskritisches Problem haben, schreiben Sie besser einen Endpunkt, der mit Pyhton geschrieben wurde, und rufen ihn auf. Weil es so implementiert ist, wie unter datatracker.ietf.org/doc/html/rfc4122.html