Ich habe auf allem, was hier erwähnt wurde, aufgebaut, um etwas doppelt so Schnelles zu erzeugen, das in allen Umgebungen, einschließlich Node, portabel ist, und habe von Math.random() auf kryptostarke Zufälligkeit umgestellt. Man könnte meinen, dass eine UUID keine Kryptostärke braucht, aber das bedeutet, dass die Wahrscheinlichkeit einer Kollision noch geringer ist, was der ganze Sinn einer UUID ist.
function random() {
const
fourBytesOn = 0xffffffff, // 4 bytes, all 32 bits on: 4294967295
c = typeof crypto === "object"
? crypto // Node.js or most browsers
: typeof msCrypto === "object" // Stinky non-standard Internet Explorer
? msCrypto // eslint-disable-line no-undef
: null; // What old or bad environment are we running in?
return c
? c.randomBytes
? parseInt(c.randomBytes(4).toString("hex"), 16) / (fourBytesOn + 1) - Number.EPSILON // Node.js
: c.getRandomValues(new Uint32Array(1))[0] / (fourBytesOn + 1) - Number.EPSILON // Browsers
: Math.random();
}
function uuidV4() { // eslint-disable-line complexity
// If possible, generate a single random value, 128 bits (16 bytes)
// in length. In an environment where that is not possible, generate
// and make use of four 32-bit (4-byte) random values.
// Use crypto-grade randomness when available, else Math.random()
const
c = typeof crypto === "object"
? crypto // Node.js or most browsers
: typeof msCrypto === "object" // Stinky non-standard Internet Explorer
? msCrypto // eslint-disable-line no-undef
: null; // What old or bad environment are we running in?
let
byteArray = c
? c.randomBytes
? c.randomBytes(16) // Node.js
: c.getRandomValues(new Uint8Array(16)) // Browsers
: null,
uuid = [ ];
/* eslint-disable no-bitwise */
if ( ! byteArray) { // No support for generating 16 random bytes
// in one shot -- this will be slower
const
int = [
random() * 0xffffffff | 0,
random() * 0xffffffff | 0,
random() * 0xffffffff | 0,
random() * 0xffffffff | 0
];
byteArray = [ ];
for (let i = 0; i < 256; i++) {
byteArray[i] = int[i < 4 ? 0 : i < 8 ? 1 : i < 12 ? 2 : 3] >> i % 4 * 8 & 0xff;
}
}
byteArray[6] = byteArray[6] & 0x0f | 0x40; // Always 4, per RFC, indicating the version
byteArray[8] = byteArray[8] & 0x3f | 0x80; // Constrained to [89ab], per RFC for version 4
for (let i = 0; i < 16; ++i) {
uuid[i] = (byteArray[i] < 16 ? "0" : "") + byteArray[i].toString(16);
}
uuid =
uuid[ 0] + uuid[ 1] + uuid[ 2] + uuid[ 3] + "-" +
uuid[ 4] + uuid[ 5] + "-" +
uuid[ 6] + uuid[ 7] + "-" +
uuid[ 8] + uuid[ 9] + "-" +
uuid[10] + uuid[11] + uuid[12] + uuid[13] + uuid[14] + uuid[15];
return uuid;
/* eslint-enable no-bitwise */
}
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