Respostas:
Veja o uuidgen
programa que faz parte do pacote e2fsprogs .
De acordo com isso , libuuid
agora faz parte do util-linux e a inclusão no e2fsprogs está sendo eliminada. No entanto, nos novos sistemas Ubuntu, uuidgen
agora está no uuid-runtime
pacote.
Para criar um uuid e salvá-lo em uma variável:
uuid=$(uuidgen)
No meu sistema Ubuntu, os caracteres alfa são impressos em minúsculas e, no sistema OS X, em maiúsculas (obrigado a David por apontar isso em um comentário).
Para alternar para todas as letras maiúsculas (depois de gerá-las como acima):
uuid=${uuid^^}
Para alternar para todas as minúsculas:
uuid=${uuid,,}
Se, por exemplo, você tiver dois UUIDs e quiser compará-los no Bash, ignorando o caso deles, poderá fazer uma tolower()
comparação de estilos como esta:
if [[ ${uuid1,,} == ${uuid2,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
gera as duas linhas). Se isso importa para você e você tem Bash 4, você pode fazer isso para torná-lo minúsculas: uuid=$(uuidgen); uuid=${uuid,,}
ou isso para torná-lo maiúsculas: uuid=$(uuidgen); uuid=${uuid^^}
ou algo nesse sentido para fazer um tolower()
teste de estilo:if [[ ${uuid1,,} == ${uuid2,,} ]]
Para adicionar variedade sem adicionar dependências externas, no Linux, você pode:
UUID=$(cat /proc/sys/kernel/random/uuid)
Para propagar más práticas, no FreeBSD , na camada de compatibilidade do linux (linuxulator?),
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
Referências:
Apenas por uma questão de completude ... Há também um gerador UUID instalado com o dbus
pacote no Debian. Eu senti falta de olhar ao redor mais cedo. Provavelmente é o mesmo algoritmo que o pacote e2fsprogs, mas não adiciona os traços, portanto pode ser um pouco mais limpo para você:
$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d
$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6
O Grawity adiciona uma dica de segurança: "Os UUIDs do DBus não estão relacionados ou são compatíveis com o RFC 4122. Além disso, o dbus-uuidgen sempre usa o registro de data e hora do Unix como os últimos 4 bytes. Portanto, eles podem ser inadequados para alguns usos." (Obrigado, Grawity, eu deveria ter descoberto isso na página de manual.)
dbus-uuidgen
sempre usa o registro de data e hora do Unix como os últimos 4 bytes. Portanto, eles podem ser inadequados para alguns usos.
Se você não deseja depender de outros executáveis ou não pode usá-los, aqui está a versão pura do bash a partir daqui :
# 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
variável pode ser eliminada e o for T
loop pode ser alterado para: case $N in 3 | 5 | 7 | 9) printf '-';; esac
(dividido em linhas separadas, se preferir).
case
para eliminar as if
declarações e a for
declaração interna . Isso torna o código muito mais organizado. Observe que ambos B%15
devem ser B%16
e B%255
devem ser B%256
.
source <(curl url)
Eu achei esse script "one-liner" útil quando o uuidgen não está disponível. Isso também ignora qualquer necessidade de instalar módulos externos para Perl ou Python.
od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
Testado no SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 e mais recente com sucesso. Estou curioso para saber se isso é propenso à não-exclusividade, mas não tenho estado assim nos últimos dez anos. Claro, head -1
pode ser substituído por head -_other-value_ | tail -1
também.
Explicar,
/dev/random
e /dev/urandom
são geradores aleatórios do kernel.
od
(octal dump) possui um comutador de saída hexadecimal (-x) produzindo 16 bytes por linha.
head
-n [| tail -1] (onde n> 0) extrai apenas uma linha da saída anterior.
awk
define o OutputFieldSeparator como um hífen em qualquer lugar em que uma vírgula ocorra na instrução print. Ao especificar os campos 2 a 9 independentemente, controlamos os hífens e eliminamos o contador de índice / deslocamento com o qual 'od' prefixa cada linha de saída.
O resultado é um padrão de 8-4-4-4-12
caracteres minúsculos 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}'
Apenas para que o python não se sinta deixado de fora:
python -c 'import uuid; print uuid.uuid1()'
2d96768e-02b3-11df-bec2-001e68b9d147
Para usá-lo no shell:
myvar=$(python -c 'import uuid; print uuid.uuid1()')
Veja o UUID da documentação do Python para obter os tipos de UUIDS que podem ser gerados.
Para gerar um arquivo systemd compatível com o ID da máquina em uma máquina que não seja systemd, você pode usar o python da seguinte maneira:
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
for python3
O Perl fornece uma biblioteca UUID baseada no e2fsprogs
pacote. No meu sistema Debian é o libuuid-perl
pacote. Aqui está um exemplo de uma linha; veja man uuid
para mais:
$ 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
Isso seria trivial para adicionar a um shellscript com backticks ou $()
notação:
#!/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
Trabalhou para mim, então eu corri uuid
Eu escrevi uma pequena função Bash usando Python para gerar um número arbitrário de UUIDs em massa:
# 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 você preferir letras minúsculas, altere:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
Para:
python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
Por favor, consulte a biblioteca OSSP UUID ( http://www.ossp.org/pkg/lib/uuid/ ) e considere a instalação. Alguns projetos oferecem isso como uma opção (por exemplo, PostgreSQL). Ele lida adequadamente com os UUIDs das versões 3 e 5 , que estavam além do que minha biblioteca instalada (por exemplo, e2fsprogs) poderia suportar. Felizmente, o openSUSE o possui em um dos principais repositórios. Fazer uma versão funcionar com Windows (por exemplo, Cygwin) ou MySQL tem sido um fracasso. Parece que é hora de mudar para Linux / PostgreSQL / Python (e eu amei a GUI do SQLyog para MySQL / MariaDB), pois eu realmente preciso de UUIDs v3 e v5.
-v3 ns:URL custom-data
mecanismo de propagação.
Tenho certeza de que alguns chegarão aqui e estão apenas procurando uma maneira fácil de gerar um ID exclusivo para uso em seus scripts, e não precisa ser um verdadeiro UUID.
Nesse caso, você pode simplesmente fazer o seguinte, o que gerará um ID exclusivo até o segundo; portanto, se você executar isso várias vezes em um segundo, ainda obterá o mesmo resultado.
MYID="U$(date +%s)"
echo $MYID
irá gerar IDs como o seguinte com base na hora atual do sistema:
U1454423662
NOTA: Se você estiver no Linux ou tiver o Coreutils instalado em um mac, poderá usar o seguinte para gerar um ID exclusivo para o nanossegundo:
MYID="U$(date +%s%N)"
echo $MYID
ou se você preferir uma solução baseada em python até o nanossegundo, que deve funcionar em quase todos os lugares, execute:
MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
mktemp -u
como em MYID="$(mktemp -u)"
. Se você pode dar ao luxo de ter os arquivos temporários vazias, que ao redor até reiniciar, gota a -u
:MYID="$(mktemp)"
Esse tópico, com seus variados exemplos, foi realmente útil para mim. Freqüentemente preciso de funções uuid de vários ambientes diferentes. E embora eu adore os exemplos puros do bash, às vezes é mais conveniente usar uma biblioteca de um idioma diferente.
Portanto, apenas por questões de detalhe, o ruby (1.9.3+) possui o módulo SecureRandom interno que contém várias funções úteis de hash e identificação. No bash cli, você pode fazer isso.
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
fornece isso abaixo 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 você estiver usando o Java 10.
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
jshell
pode ser usado no script bash , e não como um comando interativo . Isso é muito claro no post original.
echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Mas é muito mais demorado do que uuidgen
.
uuid-runtime
pacote sem razão aparente ... +1 para você)