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.

13voto

robocat Punkte 5047

Es folgt ein einfacher Code, der die crypto.getRandomValues(a) auf unterstützte Browser (Internet Explorer 11+, iOS 7+, Firefox 21+, Chrome, und Android Chrome).

Es vermeidet die Verwendung von Math.random() da dies zu Kollisionen führen kann (z. B. 20 Kollisionen für 4000 generierte UUIDs in einer realen Situation durch Muxa ).

function uuid() {
    function randomDigit() {
        if (crypto && crypto.getRandomValues) {
            var rands = new Uint8Array(1);
            crypto.getRandomValues(rands);
            return (rands[0] % 16).toString(16);
        } else {
            return ((Math.random() * 16) | 0).toString(16);
        }
    }

    var crypto = window.crypto || window.msCrypto;
    return 'xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx'.replace(/x/g, randomDigit);
}

Anmerkungen:

  • Optimiert für die Lesbarkeit des Codes, nicht für die Geschwindigkeit, so dass es für einige hundert UUIDs pro Sekunde geeignet ist. Es erzeugt etwa 10000 uuid() pro Sekunde in Chromium auf meinem Laptop mit http://jsbin.com/fuwigo/1 um die Leistung zu messen.
  • Sie verwendet nur 8 für "y", weil das die Lesbarkeit des Codes vereinfacht (y darf sein 8 , 9 , A , oder B ).

13voto

Jonathan Potter Punkte 2803

Wenn Sie nur eine zufällige 128-Bit-Zeichenkette in keinem bestimmten Format benötigen, können Sie diese verwenden:

function uuid() {
    return crypto.getRandomValues(new Uint32Array(4)).join('-');
}

Das Ergebnis ist etwa 2350143528-4164020887-938913176-2513998651 .

0 Stimmen

Warum werden übrigens nur Zahlen und nicht auch Buchstaben generiert? Das ist viel unsicherer.

2 Stimmen

Können Sie auch Zeichen (Buchstaben) wie folgt hinzufügen: Array.from((window.crypto || window.msCrypto).getRandomValues(new Uint32Array(4))).map(n => n.toString(16)).join('-')

13voto

Andrea Turri Punkte 6430

Der bessere Weg:

function(
  a, b               // Placeholders
){
  for(               // Loop :)
      b = a = '';    // b - result , a - numeric variable
      a++ < 36;      //
      b += a*51&52   // If "a" is not 9 or 14 or 19 or 24
                  ?  //  return a random number or 4
           (
               a^15              // If "a" is not 15,
                  ?              // generate a random number from 0 to 15
               8^Math.random() *
               (a^20 ? 16 : 4)   // unless "a" is 20, in which case a random number from 8 to 11,
                  :
               4                 //  otherwise 4
           ).toString(16)
                  :
         '-'                     //  In other cases, (if "a" is 9,14,19,24) insert "-"
      );
  return b
 }

Minimiert:

function(a,b){for(b=a='';a++<36;b+=a*51&52?(a^15?8^Math.random()*(a^20?16:4):4).toString(16):'-');return b}

4 Stimmen

Warum ist es besser?

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;
        };

12voto

Anatoly Mironov Punkte 6846

Wenn Ihre Umgebung SharePoint ist, gibt es eine Utility-Funktion namens SP.Guid.newGuid ( MSDN-Link was eine neue GUID erzeugt. Diese Funktion befindet sich in der Datei sp.init.js. Wenn Sie diese Funktion umschreiben (um einige andere Abhängigkeiten von anderen privaten Funktionen zu entfernen), sieht sie wie folgt aus:

var newGuid = function () {
    var result = '';
    var hexcodes = "0123456789abcdef".split("");

    for (var index = 0; index < 32; index++) {
        var value = Math.floor(Math.random() * 16);

        switch (index) {
        case 8:
            result += '-';
            break;
        case 12:
            value = 4;
            result += '-';
            break;
        case 16:
            value = value & 3 | 8;
            result += '-';
            break;
        case 20:
            result += '-';
            break;
        }
        result += hexcodes[value];
    }
    return result;
};

0 Stimmen

Die umgeleitete URL lautet "Gilt für: SharePoint Foundation 2010"

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