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.

7voto

Fernando Teles Punkte 121

Die einfachste Funktion, um dies zu tun:

function createGuid(){  
   let S4 = () => Math.floor((1+Math.random())*0x10000).toString(16).substring(1); 
   let guid = `${S4()}${S4()}-${S4()}-${S4()}-${S4()}-${S4()}${S4()}${S4()}`;

   return guid.toLowerCase();  
}

6voto

skalee Punkte 11472

Es gibt hier viele richtige Antworten, aber leider sind die mitgelieferten Codebeispiele ziemlich kryptisch und schwer zu verstehen. So erstelle ich UUIDs der Version 4 (zufällig).

Beachten Sie, dass die folgenden Teile des Codes aus Gründen der besseren Lesbarkeit binäre Literale verwenden und daher ECMAScript 6 erfordern.

Node.js-Version

function uuid4() {
  let array = new Uint8Array(16)
  crypto.randomFillSync(array)

  // Manipulate the 9th byte
  array[8] &= 0b00111111 // Clear the first two bits
  array[8] |= 0b10000000 // Set the first two bits to 10

  // Manipulate the 7th byte
  array[6] &= 0b00001111 // Clear the first four bits
  array[6] |= 0b01000000 // Set the first four bits to 0100

  const pattern = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  let idx = 0

  return pattern.replace(
    /XX/g,
    () => array[idx++].toString(16).padStart(2, "0"), // padStart ensures a leading zero, if needed
  )
}

Browser-Version

Nur die zweite Zeile ist anders.

function uuid4() {
  let array = new Uint8Array(16)
  crypto.getRandomValues(array)

  // Manipulate the 9th byte
  array[8] &= 0b00111111 // Clear the first two bits
  array[8] |= 0b10000000 // Set the first two bits to 10

  // Manipulate the 7th byte
  array[6] &= 0b00001111 // Clear the first four bits
  array[6] |= 0b01000000 // Set the first four bits to 0100

  const pattern = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
  let idx = 0

  return pattern.replace(
    /XX/g,
    () => array[idx++].toString(16).padStart(2, "0"), // padStart ensures a leading zero, if needed
  )
}

Tests

Und schließlich werden entsprechende Tests ( Jasmin ).

describe(".uuid4()", function() {
  it("returns a UUIDv4 string", function() {
    const uuidPattern = "XXXXXXXX-XXXX-4XXX-YXXX-XXXXXXXXXXXX"
    const uuidPatternRx = new RegExp(uuidPattern.
      replaceAll("X", "[0-9a-f]").
      replaceAll("Y", "[89ab]"))

    for (let attempt = 0; attempt < 1000; attempt++) {
      let retval = uuid4()
      expect(retval.length).toEqual(36)
      expect(retval).toMatch(uuidPatternRx)
    }
  })
})

UUID v4 erklärt

Eine sehr gute Erklärung der UUID-Version 4 finden Sie hier: Erzeugen einer UUID gemäß RFC 4122 .

Abschließende Anmerkungen

Außerdem gibt es eine Vielzahl von Paketen von Drittanbietern. Solange Sie jedoch nur grundlegende Bedürfnisse haben, empfehle ich sie nicht. Wirklich, es gibt nicht viel zu gewinnen und ziemlich viel zu verlieren. Die Autoren können nach winzigen Leistungssteigerungen streben, Dinge "reparieren", die nicht repariert werden sollten, und wenn es um die Sicherheit geht, ist es eine riskante Idee. Ebenso können sie andere Fehler oder Inkompatibilitäten einführen. Sorgfältige Aktualisierungen erfordern Zeit.

6voto

andersh Punkte 7439

Sie können das npm-Paket verwenden Leitfaden ein GUID-Generator und -Validator.

Beispiel:

Guid.raw();
// -> '6fdf6ffc-ed77-94fa-407e-a7b86ed9e59d'

Nota: Dieses Paket ist veraltet. Verwenden Sie uuid stattdessen.

Beispiel:

const uuidv4 = require('uuid/v4');
uuidv4(); //  '10ba038e-48da-487b-96e8-8d3b99b6d18a'

5voto

incureforce Punkte 21

Dies funktioniert auch für Node.js, wenn Sie die let buffer = new Uint8Array(); crypto.getRandomValues mit let buffer = crypto.randomBytes(16)

Es sollte die meisten Lösungen für reguläre Ausdrücke an Leistung übertreffen.

const hex = '0123456789ABCDEF'

let generateToken = function() {
    let buffer = new Uint8Array(16)

    crypto.getRandomValues(buffer)

    buffer[6] = 0x40 | (buffer[6] & 0xF)
    buffer[8] = 0x80 | (buffer[8] & 0xF)

    let segments = []

    for (let i = 0; i < 16; ++i) {
        segments.push(hex[(buffer[i] >> 4 & 0xF)])
        segments.push(hex[(buffer[i] >> 0 & 0xF)])

        if (i == 3 || i == 5 || i == 7 || i == 9) {
            segments.push('-')
        }
    }

    return segments.join('')
}

for (let i = 0; i < 100; ++i) {
  console.log(generateToken())
}

Leistungstabellen (jeder liebt sie): jsbench

5voto

mangalbhaskar Punkte 61

Eine einfache Lösung zur Erzeugung einer eindeutigen Identifizierung ist die Verwendung eines Zeittokens, dem eine Zufallszahl hinzugefügt wird. Ich ziehe es vor, ihr ein "uuid-" voranzustellen.

Die folgende Funktion erzeugt eine zufällige Zeichenkette des Typs: uuid-14d93eb1b9b4533e6 . Es ist nicht notwendig, eine 32 Zeichen lange Zufallsfolge zu erzeugen. Eine 16-stellige Zufallszeichenfolge ist in diesem Fall mehr als ausreichend, um die eindeutigen UUIDs in JavaScript bereitzustellen.

var createUUID = function() {
  return "uuid-" + ((new Date).getTime().toString(16) + Math.floor(1E7*Math.random()).toString(16));
}

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