Ich habe Code, der so aussieht:
u := make([]byte, 16)
_, err := rand.Read(u)
if err != nil {
return
}
u[8] = (u[8] | 0x80) & 0xBF // what does this do?
u[6] = (u[6] | 0x40) & 0x4F // what does this do?
return hex.EncodeToString(u)
Es gibt einen String mit einer Länge von 32 zurück, aber ich denke nicht, dass es eine gültige UUID ist. Wenn es eine echte UUID ist, warum ist es ein UUID, und was ist der Zweck des Codes, ändert sich der Wert von u[8]
und u[6]
.
Gibt es eine bessere Möglichkeit, UUIDs zu generieren?
Antworten:
Diese Zeilen klemmen die Werte von Byte 6 und 8 auf einen bestimmten Bereich.
rand.Read
Gibt zufällige Bytes im Bereich zurück0-255
, die nicht alle gültigen Werte für eine UUID sind. Soweit ich das beurteilen kann, sollte dies jedoch für alle Werte im Slice erfolgen.Wenn Sie unter Linux arbeiten, können Sie alternativ anrufen
/usr/bin/uuidgen
.Welche Ausbeuten:
quelle
u[6]
undu[8]
Bytes.Sie können UUIDs mithilfe der go-uuid- Bibliothek generieren . Dies kann installiert werden mit:
Sie können zufällige (Version 4) UUIDs generieren mit:
Der zurückgegebene
UUID
Typ ist ein 16-Byte-Array, sodass Sie den Binärwert einfach abrufen können. Über seineString()
Methode wird auch die Standarddarstellung für Hex-Zeichenfolgen bereitgestellt.Der Code, den Sie haben, sieht auch so aus, als würde er auch eine gültige UUID der Version 4 generieren: Die bitweise Manipulation, die Sie am Ende ausführen, setzt die Versions- und Variantenfelder der UUID, um sie korrekt als Version 4 zu identifizieren . Dies geschieht, um zufällige UUIDs von solchen zu unterscheiden, die über andere Algorithmen generiert wurden (z. B. UUIDs der Version 1 basierend auf Ihrer MAC-Adresse und Zeit).
quelle
Die
go-uuid
Bibliothek ist NICHT RFC4122-kompatibel. Die Variantenbits sind nicht richtig gesetzt. Es gab mehrere Versuche von Community-Mitgliedern, dieses Problem zu beheben, aber Pull-Anforderungen für das Problem werden nicht akzeptiert.Sie können UUIDs mithilfe der Go-Uuid-Bibliothek generieren, die ich basierend auf der
go-uuid
Bibliothek neu geschrieben habe. Es gibt verschiedene Korrekturen und Verbesserungen. Dies kann installiert werden mit:Sie können zufällige (Version 4) UUIDs generieren mit:
Der zurückgegebene UUID-Typ ist eine Schnittstelle und der zugrunde liegende Typ ist ein Array.
Die Bibliothek generiert auch v1-UUIDs und generiert korrekt v3- und 5-UUIDs. Es gibt verschiedene neue Methoden zum Drucken und Formatieren sowie neue allgemeine Methoden zum Erstellen von UUIDs basierend auf vorhandenen Daten.
quelle
"crypto / rand" ist ein plattformübergreifendes Paket für die Erzeugung zufälliger Bytes
quelle
pseudo_uuid
weil es die nicht zufälligen Bezeichner wie MAC-Adresse und was auch immer sonst RFC4122 angegeben fehlt? Also ist es eigentlich eher zufällig.%x
Probleme mit Byte-Werten unter 128 haben, müssen Sie eine Auffüllung anwenden, dh%04x
für ein Byte-PaarEs gibt eine offizielle Implementierung von Google: https://github.com/google/uuid
Das Generieren einer UUID der Version 4 funktioniert folgendermaßen:
Probieren Sie es hier aus: https://play.golang.org/p/6YPi1djUMj9
quelle
New()
und es ist gleichbedeutend mituuid.Must(uuid.NewRandom())
rand.Reader
. Ich bin nicht sicher, ob dieser jemals einen Fehler zurückgeben würde oder ob dies nur mit einem benutzerdefinierten Reader passieren kann ...gofrs / uuid ist der Ersatz für satori / go.uuid , das mit den meisten Sternen ausgezeichnete UUID-Paket für Go . Es unterstützt die UUID-Versionen 1-5 und ist RFC 4122- und DCE 1.1-kompatibel.
quelle
Aus Russ Cox ' Beitrag :
Hinweis: In der ursprünglichen Version vor Go 1 lautete die erste Zeile:
Hier wird kompiliert und ausgeführt, es werden nur
/dev/urandom
alle Nullen auf dem Spielplatz zurückgegeben. Sollte vor Ort gut funktionieren.Im selben Thread wurden einige andere Methoden / Referenzen / Pakete gefunden.
quelle
import "crypto/rand"
Meiner Meinung nach besser zu verwenden , aber +1 füruuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
. In Kombination mit dem OP-Code funktioniert dies hervorragend.Wenn Sie als Teil der UUID-Spezifikation eine UUID aus einem Zufallsprinzip generieren, muss diese eine "4" als 13. Zeichen und eine "8", "9", "a" oder "b" im 17. ( Quelle ) enthalten.
quelle
Der Gorand Paket verfügt über eine UUID-Methode, die eine (zufällig generierte) UUID der Version 4 in ihrer kanonischen Zeichenfolgendarstellung ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") zurückgibt und RFC 4122-kompatibel ist.
Außerdem wird das Crypto / Rand-Paket verwendet, um die kryptografisch sicherste Generierung von UUIDs auf allen von Go unterstützten Plattformen sicherzustellen.
quelle
Unter Linux können Sie lesen von
/proc/sys/kernel/random/uuid
:Keine externen Abhängigkeiten!
quelle
Für Windows habe ich kürzlich Folgendes getan:
quelle
Diese Bibliothek ist unser Standard für die Generierung und Analyse von Benutzeroberflächen:
https://github.com/pborman/uuid
quelle