Yanıtlar:
E2fsprogs paketinin bir uuidgen
parçası olan programa bakın .
Göre bu , libuuid
şimdi bir parçası olan util-linux ve e2fsprogs içinde içerme aşamalı olarak. Ancak, yeni Ubuntu sistemlerinde, uuidgen
şimdi uuid-runtime
pakette.
Bir uuid oluşturmak ve onu bir değişkene kaydetmek için:
uuid=$(uuidgen)
Ubuntu sistemimde, alfa karakterleri küçük harf, OS X sistemimde büyük harf olarak çıkarlar (bunu yorum için David ile işaretlediğiniz için teşekkürler).
Tüm büyük harflere geçmek için (yukarıdaki gibi oluşturduktan sonra):
uuid=${uuid^^}
Tüm küçük harflere geçmek için:
uuid=${uuid,,}
Örneğin, iki UUID'niz varsa ve bunları Bash'de karşılaştırmak istiyorsanız, durumlarını dikkate almazsanız, bunun tolower()
gibi bir stil karşılaştırması yapabilirsiniz :
if [[ ${uuid1,,} == ${uuid2,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
ikisi de geçerli onaltılık karakterleri temsil ettiği için ( her iki satırı da çıktılar) gerçekten önemli değil . Sizin için önemliyse ve Bash 4'ünüz varsa, bunu küçük harf yapmak için yapabilirsiniz: uuid=$(uuidgen); uuid=${uuid,,}
veya bunu büyük harf yapmak için yapabilirsiniz: uuid=$(uuidgen); uuid=${uuid^^}
ya da bu tolower()
testler boyunca bir stil testi yapmak için :if [[ ${uuid1,,} == ${uuid2,,} ]]
Harici bağımlılıklar eklemeden çeşitlilik eklemek için Linux'ta şunları yapabilirsiniz:
UUID=$(cat /proc/sys/kernel/random/uuid)
Kötü uygulamaları, FreeBSD'de linux uyumluluk katmanı altında (linuxulator?) Yaymak,
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
Referanslar:
Sadece eksiksizlik adına ... dbus
Debian paketinde yüklü bir UUID üreteci de var . Daha önce etrafa bakmayı özledim. Muhtemelen e2fsprogs paketi ile aynı algoritmadır, ancak çizgi eklememektedir, bu yüzden sizin için biraz daha temiz olabilir:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawity bir güvenlik ipucu ekliyor: "DBus UUID'ler RFC 4122 ile ilişkili değil veya bunlarla uyumlu değil . Ayrıca, dbus-uuidgen , Unix zaman damgasını her zaman son 4 bayt olarak kullanıyor. Bu nedenle bazı kullanımlar için uygun olmayabilir." (Teşekkürler, Grawity, bunu sayfada görmeliydim.)
dbus-uuidgen
Unix zaman damgasını her zaman son 4 bayt olarak kullanır. Bu yüzden bazı kullanımlar için uygun olmayabilirler.
Diğer yürütülebilir bağlı istemiyoruz veya bunları kullanamaz, burada saf bash versiyonu burada :
# 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
Değişken elimine edilebilir ve for T
döngü değiştirilebilir: case $N in 3 | 5 | 7 | 9) printf '-';; esac
(tercih edilen ise ayrı satırlarda ayrılmış).
case
kaldırmak için kullanılan bir sürümü gösteren github bağlantısındaki koda bir yorum ekledim . Kodu çok daha düzenli yapar. Her ikisi de olması gerektiğini ve olması gerektiğini unutmayın . if
for
B%15
B%16
B%255
B%256
source <(curl url)
ya da her neyse
Uuidgen'in bulunmadığı yerlerde bu yazıyı "one-liner" olarak faydalı buldum. Bu aynı zamanda Perl veya Python için harici modüller kurmak için gerekli olan her şeyi atlar.
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 ve başarıyla test edildi. Bu benzersiz olmayan eğilimli olup olmadığını merak ediyorum, ama son 10 yılda 'bit'ten olmadım. Tabii ki head -1
ile head -_other-value_ | tail -1
de değiştirilebilir .
Açıklamak
/dev/random
ve /dev/urandom
çekirdek rasgele üreteçleridir.
od
(sekizli boşaltma), her satırda 16 bayt üreten bir altıgen çıkış anahtarına (-x) sahiptir.
head
-n [| kuyruk -1] (burada n> 0) önceki çıktının yalnızca bir satırını çıkarır.
awk
OutputFieldSeparator’u print deyiminde virgülün olduğu her yerde kısa çizgi olacak şekilde ayarlar. 2-9 alanlarını bağımsız olarak belirterek, kısa çizgileri kontrol ederiz ve 'od' ile her bir çıktı satırını ön ekleyen dizin / ofset sayacını çıkarırız.
Sonuç, 8-4-4-4-12
küçük harf karakterlerden oluşan bir kalıptır 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}'
Sadece python kaldığını hissetmediği için:
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
Kabukta kullanmak için:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
Üretilebilecek UUIDS türleri için Python Belgeleri UUID'sine bakın .
Sistem dışı bir makinede sistemd makine kimliği uyumlu bir dosya oluşturmak için, bu şekilde yapmak için python kullanabilirsiniz:
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
Python3 için kullanın
Perl, e2fsprogs
pakete dayalı bir UUID kütüphanesi sağlar . Debian sistemimde libuuid-perl
paket var. İşte bir örnek bir astar; man uuid
daha fazlası için bakınız :
$ 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
Bu backticks veya $()
notasyon ile bir shellscript eklemek önemsiz olurdu :
#!/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
Benim için çalıştım, sonra kaçtım uuid
Python kullanarak küçük bir Bash işlevi toplu olarak rastgele sayıda UUID oluşturmak için yazdım:
# 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"')]))'
}
Küçük harfleri tercih ediyorsanız değiştirin:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
Kime:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
Lütfen OSSP UUID kütüphanesine bakın ( http://www.ossp.org/pkg/lib/uuid/ ) ve kurmayı düşünün. Bazı projeler bunu bir seçenek olarak sunar (örn. PostgreSQL). Yüklü (ör. E2fsprogs) kütüphanemin taşıma kapasitesinin ötesinde olan, sürüm 3 ve sürüm 5 UUID'leri düzgün biçimde işler . Neyse ki, openSUSE ana depolardan birinde bulunuyor. Çalışmak için bir sürüm edinmek Windows (örneğin, Cygwin) veya MySQL'in bir suçu oldu. Gerçekten v3 ve v5 UUID'lere ihtiyaç duyduğum için Linux / PostgreSQL / Python'a (ve SQLyog GUI'yi MySQL / MariaDB'ye çok sevdim) geçiş zamanı geldi gibi görünüyor.
-v3 ns:URL custom-data
tohumlama mekanizması yoluyla ad alanını desteklediği için mükemmeldi .
Bazılarının buraya ulaşacağından eminim ve komut dosyalarında kullanılmak üzere benzersiz bir kimlik oluşturmanın kolay bir yolunu arıyorlar ve bunun gerçek bir UUID olması gerekmiyor.
Öyleyse, yalnızca ikinciye özgü bir kimlik oluşturacak olan aşağıdakileri yapabilirsiniz - yani bunu bir saniye içinde birkaç kez çalıştırırsanız, aynı sonucu elde edersiniz.
MYID="U$(date +%s)"
echo $MYID
geçerli sistem saatine göre aşağıdaki gibi kimlikler üretecektir:
U1454423662
NOT: Linux kullanıyorsanız veya bir mac'ta Coreutils kurulu ise, nanosaniye için benzersiz bir kimlik oluşturmak için aşağıdakileri kullanabilirsiniz:
MYID="U$(date +%s%N)"
echo $MYID
ya da hemen hemen her yerde çalışması gereken nanosaniyeye kadar bir python tabanlı çözümü tercih ediyorsanız:
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
gibi olacaktır MYID="$(mktemp -u)"
. Yeniden başlatılana kadar etrafta boş geçici dosyalar bırakmayı göze alıyorsanız, şunları bırakın -u
:MYID="$(mktemp)"
Bu iplik, çeşitli örneklerle benim için çok faydalı oldu. Sık sık çeşitli ortamlardan gelen uuid fonksiyonlara ihtiyacım var. Ve saf bash örneklerini sevsem de, bazen farklı bir dilden bir kütüphane kullanmak daha uygun olur.
Bu nedenle, sadece eksiksizlik için, yakut (1.9.3+), bir dizi kullanışlı karma ve id işlevi içeren yerleşik SecureRandom modülüne sahiptir. Bash Cliff'ten bunu yapabilirsiniz.
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
bunu size aşağıdaki eko verir: x 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
Java 10 kullanıyorsanız.
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
jshell
edilebilir Bash komut dosyası kullanılan ve, değil interaktif bir komut olarak . Orijinal yazıdaki bu çok açık.
echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Ama ondan çok daha uzun sürüyor uuidgen
.
uuid-runtime
görünürde bir sebep olmadan pakete yapıştırır ... +1 size)