Risposte:
Vedi il uuidgen
programma che fa parte del pacchetto e2fsprogs .
Secondo questo , libuuid
ora fa parte di util-linux e l'inclusione in e2fsprogs è in fase di eliminazione. Tuttavia, sui nuovi sistemi Ubuntu, uuidgen
è ora nel uuid-runtime
pacchetto.
Per creare un uuid e salvarlo in una variabile:
uuid=$(uuidgen)
Sul mio sistema Ubuntu, i caratteri alfa vengono visualizzati in minuscolo e sul mio sistema OS X, vengono visualizzati in maiuscolo (grazie a David per averlo sottolineato in un commento).
Per passare a tutte le maiuscole (dopo averlo generato come sopra):
uuid=${uuid^^}
Per passare a tutte le lettere minuscole:
uuid=${uuid,,}
Se, ad esempio, hai due UUID e vuoi confrontarli in Bash, ignorando il loro caso, puoi fare un tolower()
confronto di stili come questo:
if [[ ${uuid1,,} == ${uuid2,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
genera entrambe le righe). Se è importante per te e hai Bash 4, puoi farlo per renderlo minuscolo: uuid=$(uuidgen); uuid=${uuid,,}
o questo per renderlo maiuscolo: uuid=$(uuidgen); uuid=${uuid^^}
o qualcosa del genere per fare un tolower()
test di stile:if [[ ${uuid1,,} == ${uuid2,,} ]]
Per aggiungere varietà senza aggiungere dipendenze esterne, su Linux puoi fare:
UUID=$(cat /proc/sys/kernel/random/uuid)
Per propagare cattive pratiche, su FreeBSD , sotto il livello di compatibilità di linux (linuxulator?),
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
Riferimenti:
Solo per completezza ... C'è anche un generatore UUID installato con il dbus
pacchetto su Debian. Mi mancava guardarmi intorno prima. Probabilmente è lo stesso algoritmo del pacchetto e2fsprogs, ma non aggiunge i trattini, quindi potrebbe essere un po 'più pulito per te:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
Grawity aggiunge un suggerimento di sicurezza: "Gli UUID DBus non sono correlati o compatibili con RFC 4122. Inoltre, dbus-uuidgen utilizza sempre il timestamp Unix come gli ultimi 4 byte. Pertanto potrebbero non essere adatti per alcuni usi." (Grazie, Grawity, avrei dovuto individuarlo nella manpage.)
dbus-uuidgen
utilizza sempre il timestamp Unix come gli ultimi 4 byte. Quindi potrebbero non essere adatti per alcuni usi.
Se non vuoi dipendere da altri eseguibili o non puoi usarli, ecco la versione bash pura da qui :
# 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
variabile può essere eliminata e il for T
loop può essere modificato in: case $N in 3 | 5 | 7 | 9) printf '-';; esac
(suddiviso su righe separate se preferito).
case
per eliminare sia le if
istruzioni che l' for
istruzione interna . Rende il codice molto più ordinato. Nota che entrambi B%15
dovrebbero essere B%16
e B%255
dovrebbero essere B%256
.
source <(curl url)
Ho trovato questo script "one-liner" utile dove uuidgen non è disponibile. Questo evita anche qualsiasi necessità di installare moduli esterni per Perl o Python.
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
Testato su SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 e versioni successive con successo. Sono curioso di sapere se questo è incline alla non unicità, ma non sono stato 'morso' negli ultimi 10 anni. Certo, head -1
potrebbe essere sostituito head -_other-value_ | tail -1
anche con .
Spiegare,
/dev/random
e /dev/urandom
sono generatori casuali del kernel.
od
(dump ottale) ha un interruttore di uscita esadecimale (-x) che produce 16 byte per linea.
head
-n [| tail -1] (dove n> 0) estrae solo una riga dell'output precedente.
awk
imposta OutputFieldSeparator come un trattino ovunque si presenti una virgola nell'istruzione print. Specificando i campi 2-9 in modo indipendente, controlliamo i trattini e rimuoviamo il contatore indice / offset che 'od' prefigura ogni linea di output con.
Il risultato è un modello di 8-4-4-4-12
caratteri minuscoli 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}'
Proprio così Python non si sente escluso:
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
Per usarlo nella shell:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
Vedi l' UUID della documentazione di Python per i tipi di UUID che possono essere generati.
Per generare un file compatibile con ID macchina systemd su una macchina non systemd, è possibile utilizzare Python per farlo in questo modo:
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
per python3
Perl fornisce una libreria UUID basata sul e2fsprogs
pacchetto. Sul mio sistema Debian è il libuuid-perl
pacchetto. Ecco un esempio di una riga; vedere man uuid
di più:
$ 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
Questo sarebbe banale da aggiungere a uno shellscript con backtick o $()
notazione:
#!/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
Ha funzionato per me, poi ho corso uuid
Ho scritto una piccola funzione di Bash usando Python per generare un numero arbitrario di UUID in blocco:
# 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"')]))'
}
Se preferisci lettere minuscole, modifica:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
Per:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
Consulta la libreria UUID OSSP ( http://www.ossp.org/pkg/lib/uuid/ ) e valuta la possibilità di installarla. Alcuni progetti lo offrono come opzione (ad esempio PostgreSQL). Gestisce correttamente gli UUID versione 3 e versione 5 , che andavano oltre ciò che la mia libreria installata (ad es. E2fsprogs) poteva gestire. Fortunatamente, openSUSE ce l'ha in uno dei principali repository. Far funzionare una versione con Windows (ad es. Cygwin) o MySQL è stato un difetto. Sembra che sia tempo di passare a Linux / PostgreSQL / Python (e ho adorato la GUI di SQLyog su MySQL / MariaDB) poiché ho davvero bisogno degli UUID v3 e v5.
-v3 ns:URL custom-data
meccanismo di seeding.
Sono sicuro che alcuni arriveranno qui e stanno solo cercando un modo semplice per generare un ID univoco da utilizzare nei loro script e non deve essere un vero UUID.
In tal caso, puoi semplicemente fare quanto segue, che genererà un ID univoco fino al secondo, quindi se esegui questo più volte in un secondo, otterrai comunque lo stesso risultato.
MYID="U$(date +%s)"
echo $MYID
genererà ID come il seguente in base all'ora di sistema corrente:
U1454423662
NOTA: se sei su Linux o se Coreutils è installato su un Mac, puoi utilizzare quanto segue per generare un ID univoco per il nanosecondo:
MYID="U$(date +%s%N)"
echo $MYID
o se preferisci una soluzione basata su Python fino al nanosecondo, che dovrebbe funzionare quasi ovunque, esegui:
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
come in MYID="$(mktemp -u)"
. Se puoi permetterti di avere file temporanei vuoti in sospeso fino al riavvio, rilascia -u
:MYID="$(mktemp)"
Questo thread, con i suoi vari esempi, mi è stato davvero utile. Spesso ho bisogno di funzioni uuid da diversi ambienti. E mentre adoro gli esempi di puro bash, a volte è più comodo usare una libreria di una lingua diversa.
Quindi solo per completezza, ruby (1.9.3+) ha il modulo SecureRandom incorporato che contiene una serie di utili funzioni hash e id. Dal bash cli, puoi farlo.
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
ti dà questo sotto 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
Se si utilizza Java 10.
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
jshell
può essere usato negli script bash e non come comando interattivo . Questo è molto chiaro nel post originale.
echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Ma è molto più lungo di quanto non lo sia uuidgen
.
uuid-runtime
pacchetto senza una ragione apparente ... +1 per te)