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.

0voto

Jacob Ochoa Punkte 81

Der folgende Text ist nicht v4-konform, kann aber leicht geändert werden. Es ist nur ein Beispiel für die Erweiterung des Uint8Array Typ, und mit crypto.getRandomValues() um die UUID-Byte-Werte zu erzeugen.

class uuid extends Uint8Array {
    constructor() {
        super(16)
        /* Not v4, just some random bytes */
        window.crypto.getRandomValues(this)
    }
    toString() {
        let id = new String()
        for (let i = 0; i < this.length; i++) {
            /* Convert uint8 to hex string */
            let hex = this[i].toString(16).toUpperCase()

            /* Add zero padding */
            while (hex.length < 2) {
                hex = String(0).concat(hex)
            }
            id += hex

            /* Add dashes */
            if (i == 4 || i == 6 || i == 8 || i == 10 || i == 16) {
                id += '-'
            }
        }
        return id
    }
}

0voto

amn Punkte 7628

Für Situationen, in denen Sie bereits eine URL für eine Ressource erstellt haben, indem Sie le site URL.createObjectURL méthode werden Sie wahrscheinlich nicht schneller oder kürzer als wie folgt vorankommen:

const uuid = url => url.substr(-36);

Die obigen Ausführungen funktionieren mit jeder kompatiblen Implementierung von createObjectURL , da die Spezifikation ausdrücklich vorschreibt eine UUID an das Ende der vom ersteren zurückgegebenen URL angehängt werden. So ist gewährleistet, dass die letzten 36 Zeichen der UUID-Teil der generierten URL sind.

Um das klarzustellen, manchmal - vielleicht sogar meistens, wenn man alles in Betracht zieht - möchten Sie eine UUID für etwas anderes als Ressourcen erzeugen, für die Sie URLs mit createObjectURL . In diesen Fällen kann der Aufruf der letztgenannten Methode für einige new Blob() wird die Leistung absolut verschlingen (und Speicher lecken, es sei denn, Sie räumen hinter sich auf, indem Sie die entsprechende revokeObjectURL ). Trotzdem ist es ein ziemlicher "Einzeiler".

I ne pas empfehlen wir Ihnen, die obige Methode nur für die Generierung von UUIDs zu verwenden, es sei denn, Sie haben bereits URLs, die durch createObjectURL oder etwas, das eine UUID am Ende hat.

Ich wollte die obige Variante nur der Vollständigkeit halber erwähnen.

0 Stimmen

Haben Sie ein funktionierendes Beispiel, das im Browser ausgeführt werden kann?

0 Stimmen

Die Antwort gilt natürlich auch für Webbrowser, so dass das obige Beispiel funktionieren wird.

0 Stimmen

Ich sehe hier kein Codebeispiel, das kopiert und in der Konsole ausprobiert werden kann

-1voto

Hashbrown Punkte 10248

Hier ist eine Methode, die Folgendes erzeugt RFC4122 mit echtem Zufall über random.org . Wenn der Abruf fehlschlägt, wird auf die in den Browser eingebaute crypto Bibliothek, die fast genauso gut sein sollte. Und schließlich, wenn der betreffende Browser des Benutzers dies nicht unterstützt, verwendet er Math.random() .

async function UUID() {
    //get 31 random hex characters
    return (await (async () => {
        let output;
        try {
            //try from random.org
            output = (await (
                await fetch('https://www.random.org/integers/?num=31&min=0&max=15&col=31&base=16&format=plain&rnd=new')
            ).text())
                //get rid of whitespace
                .replace(/[^0-9a-fA-F]+/g, '')
            ;
            if (output.length != 31)
                throw '';
        }
        catch {
            output = '';
            try {
                //failing that, try getting 16 8-bit digits from crypto
                for (let num of crypto.getRandomValues(new Uint8Array(16)))
                    //interpret as 32 4-bit hex numbers
                    output += (num >> 4).toString(16) + (num & 15).toString(16);
                //we only want 31
                output = output.substr(1);
            }
            catch {
                //failing THAT, use Math.random
                while (output.length < 31)
                    output += (0 | Math.random() * 16).toString(16);
            }
        }
        return output;
    })())
        //split into appropriate sections, and set the 15th character to 4
        .replace(/^(.{8})(.{4})(.{3})(.{4})/, '$1-$2-4$3-$4-')
        //force character 20 to the correct range
        .replace(/(?<=-)[^89abAB](?=[^-]+-[^-]+$)/, (num) => (
            (parseInt(num, 16) % 4 + 8).toString(16)
        ))
    ;
}

enter image description here

3 Stimmen

Man sollte sich bei der Generierung von Zufallszahlen niemals auf externe Quellen verlassen, insbesondere wenn es um die Generierung von Wallet-Adressen geht.

2 Stimmen

Dann deaktivieren Sie diesen Teil oder richten Sie ihn auf Ihre eigene Serverfarm? Das ist nicht schwer. Aber wenn Sie etwas unterstützen, das nicht unterstützt wird crypto Sie nicht sich verlassen wollen auf Math . Wer zum Teufel verwendet überhaupt clientseitige Zufallszahlen für Wallet-Adressen? Wenn man Node verwendet, würde man das Betriebssystem für die uuid-Generierung anrufen. Ich verstehe eigentlich nicht, was du meinst, @Charaf

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