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.

66voto

Jed Schmidt Punkte 2867

Hier ist eine Lösung vom 9. Oktober 2011 aus einem Kommentar eines Benutzers jeder unter https://gist.github.com/982883 :

UUIDv4 = function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)}

Damit wird das gleiche Ziel erreicht wie mit dem aktuell höchstbewertete Antwort , aber mit 50+ weniger Bytes durch Ausnutzung von Coercion, Rekursion und exponentieller Notation. Für diejenigen, die neugierig sind, wie es funktioniert, hier ist die kommentierte Form einer älteren Version der Funktion:

UUIDv4 =

function b(
  a // placeholder
){
  return a // if the placeholder was passed, return
    ? ( // a random number from 0 to 15
      a ^ // unless b is 8,
      Math.random() // in which case
      * 16 // a random number from
      >> a/4 // 8 to 11
      ).toString(16) // in hexadecimal
    : ( // or otherwise a concatenated string:
      [1e7] + // 10000000 +
      -1e3 + // -1000 +
      -4e3 + // -4000 +
      -8e3 + // -80000000 +
      -1e11 // -100000000000,
      ).replace( // replacing
        /[018]/g, // zeroes, ones, and eights with
        b // random hex digits
      )
}

53voto

Tikolu Punkte 35

Einzeilige Lösung mit Blobs.

window.URL.createObjectURL(new Blob([])).substring(31);

Der Wert am Ende (31) hängt von der Länge der URL ab.


EDIT:

Eine kompaktere und universellere Lösung, wie sie von rinogo :

URL.createObjectURL(new Blob([])).substr(-36);

13 Stimmen

Alternativ dazu window.URL.createObjectURL(new Blob([])).split('/').pop() wird das Gleiche tun, ohne sich auf externe Faktoren wie die Länge der URL verlassen zu müssen.

2 Stimmen

Was ist "Blob"/"Blobs"?

0 Stimmen

@PeterMortensen Ein Blob ist eine undurchsichtige, effiziente Darstellung einer bestimmten Menge "roher" (binärer) Daten, um die Skripterstellung im Web zu erleichtern.

39voto

sleeplessnerd Punkte 20253
var uuid = function() {
    var buf = new Uint32Array(4);
    window.crypto.getRandomValues(buf);
    var idx = -1;
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        idx++;
        var r = (buf[idx>>3] >> ((idx%8)*4))&15;
        var v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    });
};

Diese Version basiert auf der Antwort von Briguy37 und einigen bitweisen Operatoren, um Fenster in Nibble-Größe aus dem Puffer zu extrahieren.

Es sollte dem RFC Type 4 (random) Schema entsprechen, denn ich hatte Probleme das letzte Mal, dass nicht konforme UUIDs mit Javas UUID geparst wurden.

39voto

Mathieu Pagé Punkte 10074

Dadurch wird eine UUID der Version 4 (aus Pseudozufallszahlen) erstellt:

function uuid()
{
   var chars = '0123456789abcdef'.split('');

   var uuid = [], rnd = Math.random, r;
   uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
   uuid[14] = '4'; // version 4

   for (var i = 0; i < 36; i++)
   {
      if (!uuid[i])
      {
         r = 0 | rnd()*16;

         uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
      }
   }

   return uuid.join('');
}

Hier ist ein Beispiel für die erzeugten UUIDs:

682db637-0f31-4847-9cdf-25ba9613a75c
97d19478-3ab2-4aa1-b8cc-a1c3540f54aa
2eed04c9-2692-456d-a0fd-51012f947136

35voto

kayz1 Punkte 6906

Einfaches JavaScript-Modul als eine Kombination der besten Antworten auf diese Frage.

var crypto = window.crypto || window.msCrypto || null; // IE11 fix

var Guid = Guid || (function() {

  var EMPTY = '00000000-0000-0000-0000-000000000000';

  var _padLeft = function(paddingString, width, replacementChar) {
    return paddingString.length >= width ? paddingString : _padLeft(replacementChar + paddingString, width, replacementChar || ' ');
  };

  var _s4 = function(number) {
    var hexadecimalResult = number.toString(16);
    return _padLeft(hexadecimalResult, 4, '0');
  };

  var _cryptoGuid = function() {
    var buffer = new window.Uint16Array(8);
    crypto.getRandomValues(buffer);
    return [_s4(buffer[0]) + _s4(buffer[1]), _s4(buffer[2]), _s4(buffer[3]), _s4(buffer[4]), _s4(buffer[5]) + _s4(buffer[6]) + _s4(buffer[7])].join('-');
  };

  var _guid = function() {
    var currentDateMilliseconds = new Date().getTime();
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(currentChar) {
      var randomChar = (currentDateMilliseconds + Math.random() * 16) % 16 | 0;
      currentDateMilliseconds = Math.floor(currentDateMilliseconds / 16);
      return (currentChar === 'x' ? randomChar : (randomChar & 0x7 | 0x8)).toString(16);
    });
  };

  var create = function() {
    var hasCrypto = crypto != 'undefined' && crypto !== null,
      hasRandomValues = typeof(window.crypto.getRandomValues) != 'undefined';
    return (hasCrypto && hasRandomValues) ? _cryptoGuid() : _guid();
  };

  return {
    newGuid: create,
    empty: EMPTY
  };
})();

// DEMO: Create and show GUID
console.log('1. New Guid:   ' + Guid.newGuid());

// DEMO: Show empty GUID
console.log('2. Empty Guid: ' + Guid.empty);

Verwendung:

Guid.newGuid()

"c6c2d12f-d76b-5739-e551-07e6de5b0807"

Guid.leer

"00000000-0000-0000-0000-000000000000"

1 Stimmen

Was stört Sie an alle Antworten ist, dass es scheint ok für JavaScript zum Speichern der GUID als string . Ihre Antwort befasst sich zumindest mit der viel effizientere Speicherung mit einem Uint16Array . Die toString Funktion sollte die binäre Darstellung in einem JavaScript object

0 Stimmen

Die von diesem Code erzeugten UUIDs sind entweder weak-aber-RFC-konform (_guid) oder strong-aber-nicht-RFC-konform (_cryptoGuid). Ersteres verwendet Math.random(), das bekanntermaßen ein schlechter RNG ist. Bei der letzteren werden die Felder version und variant nicht gesetzt.

0 Stimmen

@broofa - Was würdest du vorschlagen, um sie stark zu machen? y RFC-konform? Und warum ist _cryptoGuid nicht RFC-konform?

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