Mam kod, który wygląda następująco:
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)
Zwraca ciąg o długości 32, ale nie sądzę, że jest to poprawny identyfikator UUID. Jeśli jest to prawdziwy identyfikator UUID, dlaczego jest to identyfikator UUID i jaki jest cel kodu modyfikującego wartość u[8]
i u[6]
.
Czy istnieje lepszy sposób generowania UUID?
Odpowiedzi:
Te linie ograniczają wartości bajtów 6 i 8 do określonego zakresu.
rand.Read
zwraca losowe bajty z zakresu0-255
, które nie są poprawnymi wartościami identyfikatora UUID. O ile wiem, należy to zrobić dla wszystkich wartości w wycinku.Jeśli korzystasz z Linuksa, możesz alternatywnie zadzwonić
/usr/bin/uuidgen
.Co daje:
źródło
u[6]
iu[8]
.Możesz generować UUID za pomocą biblioteki go-uuid . Można to zainstalować za pomocą:
Możesz generować losowe (wersja 4) UUID za pomocą:
Zwracany
UUID
typ to 16-bajtowa tablica, dzięki czemu można łatwo pobrać wartość binarną. Zapewnia również standardową reprezentację ciągu szesnastkowego poprzez swojąString()
metodę.Wygląda również na to, że kod, który posiadasz, wygeneruje również prawidłowy identyfikator UUID wersji 4: manipulacja bitowa, którą wykonujesz na końcu, ustawia pola wersji i wariantów UUID, aby poprawnie zidentyfikować go jako wersję 4 . Ma to na celu odróżnienie losowych identyfikatorów UUID od tych generowanych przez inne algorytmy (np. UUID wersji 1 na podstawie adresu MAC i czasu).
źródło
Plik
go-uuid
Biblioteka nie jest zgodny z RFC4122. Bity wariantu nie są ustawione poprawnie. Członkowie społeczności podjęli kilka prób, aby to naprawić, ale żądania ściągnięcia poprawki nie są akceptowane.Możesz generować UUID za pomocą biblioteki Go uuid, którą przepisałem na podstawie tej
go-uuid
biblioteki. Istnieje kilka poprawek i ulepszeń. Można to zainstalować za pomocą:Możesz generować losowe (wersja 4) UUID za pomocą:
Zwrócony typ UUID jest interfejsem, a typem bazowym jest tablica.
Biblioteka generuje również identyfikatory UUID v1 i poprawnie generuje identyfikatory UUID v3 i 5. Istnieje kilka nowych metod ułatwiających drukowanie i formatowanie, a także nowe ogólne metody tworzenia identyfikatorów UUID na podstawie istniejących danych.
źródło
„crypto / rand” to wieloplatformowy pakiet do generowania losowych bajtów
źródło
pseudo_uuid
ponieważ brakuje nielosowych identyfikatorów, takich jak adres MAC i cokolwiek innego, co określono w RFC4122? Więc jest to bardziej przypadkowe.%x
ma tylko problemy z wartościami bajtów mniejszymi niż 128, musisz zastosować dopełnienie, np.%04x
Dla pary bajtówIstnieje oficjalna implementacja Google: https://github.com/google/uuid
Generowanie UUID wersji 4 działa w następujący sposób:
Wypróbuj tutaj: https://play.golang.org/p/6YPi1djUMj9
źródło
New()
i jest to równoważneuuid.Must(uuid.NewRandom())
rand.Reader
. Nie jestem pewien, czy kiedykolwiek zwróci błąd, czy może się to zdarzyć tylko z niestandardowym czytnikiem ...gofrs / uuid to zamiennik satori / go.uuid , który jest najbardziej gwiazdkowym pakietem UUID dla Go . Obsługuje UUID w wersjach 1-5 i jest zgodny z RFC 4122 i DCE 1.1.
źródło
Z posta Russa Coxa :
Uwaga: w oryginalnej wersji Go 1 pierwsza linia była:
Tutaj tylko kompiluje i wykonuje
/dev/urandom
zwraca wszystkie zera na placu zabaw. Lokalnie powinno działać dobrze.W tym samym wątku znajduje się kilka innych metod / odwołań / pakietów.
źródło
import "crypto/rand"
Moim zdaniem lepiej używać , ale +1 zauuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
. W połączeniu z kodem OP, a to działa świetnie.W ramach specyfikacji uuid, jeśli generujesz uuid z random, musi on zawierać „4” jako 13. znak i „8”, „9”, „a” lub „b” na 17. miejscu ( źródło ).
źródło
gorand opakowanie ma UUID metody zwracającej wersja 4 (losowo wygenerowanym) uuid IN kanonicznej ciąg znaków ( „XXXXXXXXXXXX-xxxxxxxx-XXXXXXXXXXXX”) i jest zgodny z RFC 4122.
Używa również pakietu crypto / rand, aby zapewnić najbardziej kryptograficznie bezpieczne generowanie identyfikatorów UUID na wszystkich platformach obsługiwanych przez Go.
źródło
W systemie Linux można odczytać z
/proc/sys/kernel/random/uuid
:Żadnych zewnętrznych zależności!
źródło
W przypadku systemu Windows ostatnio zrobiłem to:
źródło
Ta biblioteka jest naszym standardem do generowania i analizowania uuidów:
https://github.com/pborman/uuid
źródło