Saya memiliki kode yang terlihat seperti ini:
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)
Ia mengembalikan string dengan panjang 32, tapi saya rasa itu bukan UUID yang valid. Jika itu adalah UUID yang sebenarnya, mengapa itu UUID, dan apa tujuan kode yang mengubah nilai u[8]
dan u[6]
.
Apakah ada cara yang lebih baik untuk menghasilkan UUID?
Jawaban:
Garis-garis ini menjepit nilai byte 6 dan 8 ke kisaran tertentu.
rand.Read
mengembalikan byte acak dalam rentang tersebut0-255
, yang tidak semuanya merupakan nilai yang valid untuk UUID. Sejauh yang saya tahu, ini harus dilakukan untuk semua nilai dalam irisan.Jika Anda menggunakan linux, Anda dapat menelepon
/usr/bin/uuidgen
.Hasil yang mana:
sumber
u[6]
danu[8]
byte.Anda dapat membuat UUID menggunakan pustaka go-uuid . Ini dapat diinstal dengan:
Anda dapat membuat UUID (versi 4) acak dengan:
UUID
Jenis yang dikembalikan adalah array 16 byte, sehingga Anda dapat mengambil nilai biner dengan mudah. Ini juga menyediakan representasi string hex standar melaluiString()
metodenya.Kode yang Anda miliki juga terlihat seperti itu juga akan menghasilkan UUID versi 4 yang valid: manipulasi bitwise yang Anda lakukan di bagian akhir mengatur bidang versi dan varian dari UUID untuk mengidentifikasinya dengan benar sebagai versi 4 . Ini dilakukan untuk membedakan UUID acak dari yang dihasilkan melalui algoritme lain (mis. UUID versi 1 berdasarkan alamat MAC dan waktu Anda).
sumber
The
go-uuid
perpustakaan TIDAK RFC4122 compliant. Bit varian tidak disetel dengan benar. Ada beberapa upaya oleh anggota komunitas untuk memperbaikinya tetapi permintaan penarikan untuk perbaikan tidak diterima.Anda dapat membuat UUID menggunakan pustaka Go uuid yang saya tulis ulang berdasarkan
go-uuid
pustaka. Ada beberapa perbaikan dan peningkatan. Ini dapat diinstal dengan:Anda dapat membuat UUID (versi 4) acak dengan:
Jenis UUID yang dikembalikan adalah antarmuka dan jenis yang mendasarinya adalah array.
Pustaka juga menghasilkan UUID v1 dan dengan benar menghasilkan v3 dan 5 UUID. Ada beberapa metode baru untuk membantu pencetakan dan pemformatan dan juga metode umum baru untuk membuat UUID berdasarkan data yang ada.
sumber
"crypto / rand" adalah pkg lintas platform untuk pembuatan byte acak
sumber
pseudo_uuid
karena tidak ada pengenal non-acak seperti alamat MAC dan apa pun yang ditentukan RFC4122? Jadi sebenarnya lebih acak.%x
memiliki masalah dengan nilai byte kurang dari 128, Anda perlu menerapkan padding, yaitu%04x
untuk pasangan byteAda implementasi resmi oleh Google: https://github.com/google/uuid
Menghasilkan UUID versi 4 berfungsi seperti ini:
Coba di sini: https://play.golang.org/p/6YPi1djUMj9
sumber
New()
dan itu setara denganuuid.Must(uuid.NewRandom())
rand.Reader
. Saya tidak yakin apakah yang itu akan mengembalikan kesalahan atau apakah ini hanya dapat terjadi dengan Pembaca khusus ...gofrs / uuid adalah pengganti satori / go.uuid , yang merupakan paket UUID yang paling berbintang untuk Go . Ini mendukung UUID versi 1-5 dan sesuai dengan RFC 4122 dan DCE 1.1.
sumber
Dari postingan Russ Cox :
Catatan: Dalam versi asli, pra Go 1 baris pertama adalah:
Di sini ia mengkompilasi dan mengeksekusi, hanya
/dev/urandom
mengembalikan semua nol di taman bermain. Seharusnya bekerja dengan baik secara lokal.Di utas yang sama ada beberapa metode / referensi / paket lain yang ditemukan.
sumber
import "crypto/rand"
menurut saya, tetapi +1 untukuuid := fmt.Sprintf("%x-%x-%x-%x-%x", b[0:4], b[4:6], b[6:8], b[8:10], b[10:])
. Dikombinasikan dengan kode OP, dan ini berfungsi dengan baik.Sebagai bagian dari spesifikasi uuid, jika Anda membuat sebuah uuid dari acak, itu harus berisi "4" sebagai karakter ke-13 dan "8", "9", "a", atau "b" di ke-17 ( sumber ).
sumber
The gorand paket memiliki metode UUID yang kembali Versi 4 (secara acak) UUID di representasi string kanonik nya ( "xxxxxxxxxxxx-xxxxxxxx-xxxxxxxxxxxx") dan itu RFC 4122 compliant.
Ia juga menggunakan paket crypto / rand untuk memastikan pembuatan UUID yang paling aman secara kriptografis di semua platform yang didukung oleh Go.
sumber
Di Linux, Anda dapat membaca dari
/proc/sys/kernel/random/uuid
:Tidak ada ketergantungan eksternal!
sumber
Untuk Windows, saya baru-baru ini melakukan ini:
sumber
Library ini adalah standar kami untuk pembuatan dan penguraian uuid:
https://github.com/pborman/uuid
sumber