5387 Stimmen

Wie man eine GUID / UUID erstellt

Ich versuche, in JavaScript global eindeutige Bezeichner zu erstellen. Ich bin mir nicht sicher, welche Routinen in allen Browsern verfügbar sind, wie "zufällig" und gesetzt der eingebaute Zufallszahlengenerator ist, usw.

Die GUID / UUID sollte mindestens 32 Zeichen lang sein und im ASCII-Bereich bleiben, um Probleme bei der Weitergabe zu vermeiden.

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.

12voto

ling Punkte 8381

Diese basiert auf dem Datum und fügt ein zufälliges Suffix hinzu, um die Einzigartigkeit zu "gewährleisten".

Es funktioniert gut für CSS-Bezeichner, gibt immer etwas wie zurück und ist leicht zu hacken:

uid-139410573297741

var getUniqueId = function (prefix) {
            var d = new Date().getTime();
            d += (parseInt(Math.random() * 100)).toString();
            if (undefined === prefix) {
                prefix = 'uid-';
            }
            d = prefix + d;
            return d;
        };

11voto

blubberdiblub Punkte 3905

Inspiriert durch broofa's Antwort Ich hatte meine eigene Meinung dazu:

Hier ist die kryptografisch stärkere Version mit crypto.getRandomValues .

function uuidv4() {
    const a = crypto.getRandomValues(new Uint16Array(8));
    let i = 0;
    return '00-0-4-1-000'.replace(/[^-]/g, 
            s => (a[i++] + s * 0x10000 >> s).toString(16).padStart(4, '0')
    );
}

console.log(uuidv4());

und hier ist die schnellere Version mit Math.random nach fast dem gleichen Prinzip:

function uuidv4() {
    return '00-0-4-1-000'.replace(/[^-]/g,
            s => ((Math.random() + ~~s) * 0x10000 >> s).toString(16).padStart(4, '0')
    );
}

console.log(uuidv4());

10voto

Alireza Punkte 92209

OK, mit dem uuid Paket, und seine Unterstützung für UUIDs der Versionen 1, 3, 4 und 5 , tun:

yarn add uuid

Und dann:

const uuidv1 = require('uuid/v1');
uuidv1(); //  '45745c60-7b1a-11e8-9c9c-2d42b21b1a3e'

Sie können dies auch mit vollständig spezifizierten Optionen tun:

const v1options = {
  node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
  clockseq: 0x1234,
  msecs: new Date('2011-11-01').getTime(),
  nsecs: 5678
};
uuidv1(v1options); //  '710b962e-041c-11e1-9234-0123456789ab'

Weitere Informationen finden Sie auf der npm-Seite ici .

8voto

Shital Shah Punkte 54846

Es ist wichtig, gut getesteten Code zu verwenden, der von mehreren Personen gepflegt wird, anstatt eigene Ideen zu entwickeln.

Dies ist eine der Stellen, an denen man wahrscheinlich den stabilsten Code der kürzest möglichen cleveren Version vorziehen möchte, die in Browser X funktioniert, aber die Eigenheiten von Y nicht berücksichtigt, was oft zu sehr schwer zu untersuchenden Fehlern führt, die nur zufällig bei einigen Benutzern auftreten. Persönlich verwende ich uuid-js unter https://github.com/aurigadl/uuid-js das ist Laube aktiviert, damit ich problemlos Aktualisierungen vornehmen kann.

7voto

dgellow Punkte 485

Eine TypeScript-Version von broofa's update vom 2017-06-28 auf der Grundlage crypto API:

function genUUID() {
    // Reference: https://stackoverflow.com/a/2117523/709884
    return ("10000000-1000-4000-8000-100000000000").replace(/[018]/g, s => {
        const c = Number.parseInt(s, 10)
        return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
    })
}

Die Gründe:

  • Verwendung von + zwischen number[] y number ist ungültig
  • Die Umwandlung von string a number muss explizit sein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X