Em Java, é possível criar um UUID aleatório :
UUID uuid = UUID.randomUUID();
Como fazer isso no Bash?
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,,} ]]
uuid-runtime
pacote sem razão aparente ... +1 para você)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 umtolower()
teste de estilo:if [[ ${uuid1,,} == ${uuid2,,} ]]
Para adicionar variedade sem adicionar dependências externas, no Linux, você pode:
Para propagar más práticas, no FreeBSD , na camada de compatibilidade do linux (linuxulator?),
Referências:
fonte
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ê: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.)
fonte
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 :
fonte
T
variável pode ser eliminada e ofor T
loop pode ser alterado para:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(dividido em linhas separadas, se preferir).case
para eliminar asif
declarações e afor
declaração interna . Isso torna o código muito mais organizado. Observe que ambosB%15
devem serB%16
eB%255
devem serB%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.
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 porhead -_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úsculosa-f0-9
.fonte
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:
Para usá-lo no shell:
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:
fonte
python3 -c "import uuid; print(uuid.uuid4())"
for python3O Perl fornece uma biblioteca UUID baseada no
e2fsprogs
pacote. No meu sistema Debian é olibuuid-perl
pacote. Aqui está um exemplo de uma linha; vejaman uuid
para mais:Isso seria trivial para adicionar a um shellscript com backticks ou
$()
notação:fonte
Trabalhou para mim, então eu corri
uuid
fonte
Eu escrevi uma pequena função Bash usando Python para gerar um número arbitrário de UUIDs em massa:
Se você preferir letras minúsculas, altere:
Para:
fonte
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.
fonte
-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.
irá gerar IDs como o seguinte com base na hora atual do sistema:
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:
ou se você preferir uma solução baseada em python até o nanossegundo, que deve funcionar em quase todos os lugares, execute:
fonte
mktemp -u
como emMYID="$(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.
fonte
fonte
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-25fbd26183a3Se você estiver usando o Java 10.
fonte
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 queuuidgen
.