Jawaban:
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,,} ]]
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 melakukan tolower()
tes gaya:if [[ ${uuid1,,} == ${uuid2,,} ]]
Untuk menambahkan variasi tanpa menambahkan dependensi eksternal, di Linux Anda dapat melakukannya:
UUID=$(cat /proc/sys/kernel/random/uuid)
Untuk menyebarkan praktik buruk, di FreeBSD , di bawah lapisan kompatibilitas linux (linuxulator?),
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
Referensi:
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:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
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.)
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 :
# Generate a pseudo UUID
uuid()
{
local N B T
for (( N=0; N < 16; ++N ))
do
B=$(( $RANDOM%255 ))
if (( N == 6 ))
then
printf '4%x' $(( B%15 ))
elif (( N == 8 ))
then
local C='89ab'
printf '%c%x' ${C:$(( $RANDOM%${#C} )):1} $(( B%15 ))
else
printf '%02x' $B
fi
for T in 3 5 7 9
do
if (( T == N ))
then
printf '-'
break
fi
done
done
echo
}
[ "$0" == "$BASH_SOURCE" ] && uuid
T
variabel dapat dihilangkan dan for T
lingkaran dapat diubah ke: case $N in 3 | 5 | 7 | 9) printf '-';; esac
(pecah pada baris yang berbeda jika pilihan).
case
untuk menghilangkan if
pernyataan serta for
pernyataan dalam . Itu membuat kode lebih rapi. Perhatikan bahwa keduanya B%15
harus B%16
dan B%255
seharusnya B%256
.
source <(curl url)
atau apa pun
Saya 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.
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
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 diganti head -_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 kecil a-f0-9
.
993bb8d7-323d-b5ee-db78-f976a59d8284
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:
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
Untuk menggunakannya di shell:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
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:
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
untuk python3
Perl menyediakan pustaka UUID berdasarkan e2fsprogs
paket. Di sistem Debian saya itu libuuid-perl
paket. Berikut ini contoh one-liner; lihat man uuid
lebih lanjut:
$ perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "my new UUID is $string \n";'
my new UUID is 3079e9ce-41d4-4cf3-9f90-d12f8bb752e4
Ini sepele untuk ditambahkan ke shellscript dengan backticks atau $()
notasi:
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff
apt-get install uuid
Bekerja untuk saya, lalu saya lari uuid
Saya menulis sedikit fungsi Bash menggunakan Python untuk menghasilkan sejumlah UUID dalam jumlah besar:
# uuid [count]
#
# Generate type 4 (random) UUID, or [count] type 4 UUIDs.
function uuid()
{
local count=1
if [[ ! -z "$1" ]]; then
if [[ "$1" =~ [^0-9] ]]; then
echo "Usage: $FUNCNAME [count]" >&2
return 1
fi
count="$1"
fi
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
}
Jika Anda lebih suka huruf kecil, ubah:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
Untuk:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
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.
-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.
MYID="U$(date +%s)"
echo $MYID
akan menghasilkan id seperti berikut berdasarkan waktu sistem saat ini:
U1454423662
CATATAN: Jika Anda menggunakan Linux, atau menginstal Coreutils di mac, maka Anda dapat menggunakan yang berikut ini untuk menghasilkan id unik ke nanosecond:
MYID="U$(date +%s%N)"
echo $MYID
atau jika Anda lebih suka solusi berbasis python ke nanosecond, yang seharusnya bekerja hampir di mana saja, jalankan:
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
seperti pada MYID="$(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.
ruby -r securerandom -e 'puts SecureRandom.uuid'
ran=`od -X -A n /dev/random | head -1 | cut -c3-38`
correlation_id=`echo ${ran} | cut -c1-8`-`echo ${ran} | cut -c10-13`-`echo ${ran} | cut -c14-17`-`echo ${ran} | cut -c19-22`-`echo ${ran} | cut -c23-26``echo ${ran} | cut -c28-35`
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-25fbd26183a3
Jika Anda menggunakan Java 10.
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
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 daripada uuidgen
.
uuid-runtime
paket tanpa alasan yang jelas ... +1 untuk Anda)