Di Jawa dimungkinkan untuk membuat UUID acak :
UUID uuid = UUID.randomUUID();
Bagaimana melakukan ini di Bash?
Lihat uuidgen
program yang merupakan bagian dari paket e2fsprogs .
Menurut ini , libuuid
sekarang bagian dari util-linux dan penyertaan dalam e2fsprogs sedang dihapus. Namun, pada sistem Ubuntu baru, uuidgen
sekarang ada dalam uuid-runtime
paket.
Untuk membuat uuid dan menyimpannya dalam variabel:
uuid=$(uuidgen)
Pada sistem Ubuntu saya, karakter alfa adalah output sebagai huruf kecil dan pada sistem OS X saya, mereka adalah output sebagai huruf besar (terima kasih kepada David untuk menunjukkan ini dalam komentar).
Untuk beralih ke semua huruf besar (setelah membuatnya seperti di atas):
uuid=${uuid^^}
Untuk beralih ke semua huruf kecil:
uuid=${uuid,,}
Jika, misalnya, Anda memiliki dua UUID dan ingin membandingkannya di Bash, mengabaikan kasingnya, Anda dapat melakukan tolower()
perbandingan gaya seperti ini:
if [[ ${uuid1,,} == ${uuid2,,} ]]
uuid-runtime
paket tanpa alasan yang jelas ... +1 untuk Anda)echo -e 'f\nF' | grep '[[:xdigit:]]'
menampilkan kedua baris). Jika itu penting bagi Anda dan Anda memiliki Bash 4, Anda dapat melakukan ini untuk membuatnya menjadi huruf kecil:uuid=$(uuidgen); uuid=${uuid,,}
atau ini untuk membuatnya menjadi huruf besar:uuid=$(uuidgen); uuid=${uuid^^}
atau sesuatu di sepanjang garis ini untuk melakukantolower()
tes gaya:if [[ ${uuid1,,} == ${uuid2,,} ]]
Untuk menambahkan variasi tanpa menambahkan dependensi eksternal, di Linux Anda dapat melakukannya:
Untuk menyebarkan praktik buruk, di FreeBSD , di bawah lapisan kompatibilitas linux (linuxulator?),
Referensi:
sumber
Hanya demi kelengkapan ... Ada juga generator UUID yang diinstal dengan
dbus
paket di Debian. Saya melewatkannya melihat-lihat sebelumnya. Ini mungkin algoritma yang sama dengan paket e2fsprogs, tetapi tidak menambahkan tanda hubung, jadi mungkin akan sedikit lebih bersih untuk Anda:Grawity menambahkan tip keamanan: "DBus UUID tidak terkait atau tidak kompatibel dengan RFC 4122. Selain itu, dbus-uuidgen selalu menggunakan cap waktu Unix sebagai 4 byte terakhir. Jadi, mereka mungkin tidak cocok untuk beberapa penggunaan." (Terima kasih, Grawity, aku seharusnya melihatnya di halaman manual.)
sumber
dbus-uuidgen
selalu menggunakan cap waktu Unix sebagai 4 byte terakhir. Jadi mereka mungkin tidak cocok untuk beberapa kegunaan.Jika Anda tidak ingin bergantung pada executable lain, atau Anda tidak dapat menggunakannya, berikut ini adalah versi bash murni dari sini :
sumber
T
variabel dapat dihilangkan danfor T
lingkaran dapat diubah ke:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(pecah pada baris yang berbeda jika pilihan).case
untuk menghilangkanif
pernyataan sertafor
pernyataan dalam . Itu membuat kode lebih rapi. Perhatikan bahwa keduanyaB%15
harusB%16
danB%255
seharusnyaB%256
.source <(curl url)
atau apa punSaya telah menemukan bahwa skrip ini "satu garis" berguna di mana uuidgen tidak tersedia. Ini juga memotong setiap neccessity untuk menginstal modul eksternal untuk Perl atau Python.
Diuji pada SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 dan yang lebih baru berhasil. Saya ingin tahu apakah ini cenderung non-keunikan, tapi saya belum pernah 'bit'ten dalam 10 tahun terakhir. Tentu saja
head -1
bisa digantihead -_other-value_ | tail -1
juga.Untuk menjelaskan,
/dev/random
dan/dev/urandom
merupakan generator acak kernel.od
(octal dump) memiliki hex output switch (-x) yang menghasilkan 16 byte per baris.head
-n [| tail -1] (di mana n> 0) mengekstrak hanya satu baris dari output sebelumnya.awk
mengatur OutputFieldSeparator menjadi tanda hubung di mana-mana koma muncul dalam pernyataan cetak. Dengan menetapkan bidang 2-9 secara independen, kami mengontrol tanda hubung dan menanggalkan indeks / penghitung offset yang diawali dengan 'od' setiap baris keluaran.Hasilnya adalah pola
8-4-4-4-12
karakter huruf kecila-f0-9
.sumber
od -x /dev/urandom | head -1 | awk '{OFS="-"; srand($6); sub(/./,"4",$5); sub(/./,substr("89ab",rand()*4,1),$6); print $2$3,$4,$5,$6,$7$8$9}'
Hanya saja python tidak merasa ditinggalkan:
Untuk menggunakannya di shell:
Lihat UUID Dokumentasi Python untuk jenis-jenis UUIDS yang dapat dihasilkan.
Untuk menghasilkan file yang kompatibel dengan systemd-id mesin pada mesin non-systemd, Anda bisa menggunakan python untuk melakukannya dengan cara ini:
sumber
python3 -c "import uuid; print(uuid.uuid4())"
untuk python3Perl menyediakan pustaka UUID berdasarkan
e2fsprogs
paket. Di sistem Debian saya itulibuuid-perl
paket. Berikut ini contoh one-liner; lihatman uuid
lebih lanjut:Ini sepele untuk ditambahkan ke shellscript dengan backticks atau
$()
notasi:sumber
Bekerja untuk saya, lalu saya lari
uuid
sumber
Saya menulis sedikit fungsi Bash menggunakan Python untuk menghasilkan sejumlah UUID dalam jumlah besar:
Jika Anda lebih suka huruf kecil, ubah:
Untuk:
sumber
Silakan lihat pustaka UUS OSSP ( http://www.ossp.org/pkg/lib/uuid/ ), dan pertimbangkan untuk menginstalnya. Beberapa proyek menawarkannya sebagai opsi (misalnya PostgreSQL). Ia menangani dengan benar UUID versi 3 dan versi 5 , yang melampaui apa yang bisa ditangani oleh perpustakaan saya yang terinstal (misalnya e2fsprogs). Untungnya, openSUSE memilikinya di salah satu repo utama. Mendapatkan versi untuk bekerja dengan Windows (misalnya Cygwin) atau MySQL telah gagal. Sepertinya sudah waktunya untuk beralih ke Linux / PostgreSQL / Python (dan saya sangat menyukai GUI SQLyog ke MySQL / MariaDB) karena saya benar-benar membutuhkan UUID v3 dan v5.
sumber
-v3 ns:URL custom-data
mekanisme penyemaian.Saya yakin beberapa akan tiba di sini, dan hanya mencari cara mudah untuk menghasilkan ID unik untuk digunakan dalam skrip mereka, dan itu tidak perlu menjadi UUID sejati.
Jika demikian, Anda bisa melakukan hal berikut, yang akan menghasilkan id yang unik hingga yang kedua - jadi jika Anda menjalankan ini beberapa kali dalam satu detik, Anda masih akan mendapatkan hasil yang sama.
akan menghasilkan id seperti berikut berdasarkan waktu sistem saat ini:
CATATAN: Jika Anda menggunakan Linux, atau menginstal Coreutils di mac, maka Anda dapat menggunakan yang berikut ini untuk menghasilkan id unik ke nanosecond:
atau jika Anda lebih suka solusi berbasis python ke nanosecond, yang seharusnya bekerja hampir di mana saja, jalankan:
sumber
mktemp -u
seperti padaMYID="$(mktemp -u)"
. Jika Anda dapat memiliki file temp kosong yang diletakkan di sekitar sampai reboot, jatuhkan-u
:MYID="$(mktemp)"
Utas ini, dengan beragam contoh, benar-benar bermanfaat bagi saya. Saya sering membutuhkan fungsi uuid dari sejumlah lingkungan yang berbeda. Dan meskipun saya menyukai contoh-contoh bash murni, terkadang lebih nyaman menggunakan perpustakaan dari bahasa yang berbeda.
Jadi hanya untuk ketelitian, ruby (1.9.3+) memiliki modul SecureRandom bawaan yang berisi sejumlah fungsi hash dan id yang berguna. Dari bash cli, Anda bisa melakukan ini.
sumber
sumber
od -X -A n /dev/random | head -1 | cut -c3-38
memberi Anda ini di bawah echo $ x 4151540a 1f7d0bef 8a0725fb d26183a3 uuid =echo ${x} | cut -c1-8
-echo ${x} | cut -c10-13
-echo ${x} | cut -c14-17
-echo ${x} | cut -c19-22
-echo ${x} | cut -c23-26``echo ${x} | cut -c28-35
echo $ uuid 4151540a-1f7d-0bef-8a07-25fbd26183a3Jika Anda menggunakan Java 10.
sumber
jshell
dapat digunakan dalam bash scripting , dan bukan sebagai perintah interaktif . Itu sangat jelas dalam posting asli.echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Tapi itu jauh lebih panjang daripadauuidgen
.