Eu preciso de um UUID. Seu trabalho é gerar um.
O UUID canônico (identificador universal único) é um número hexadecimal de 32 dígitos com hífens inseridos em determinados pontos. O programa deve gerar 32 dígitos hexadecimais (128 bits), na forma de xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
( 8-4-4-4-12
dígitos), onde x
é um número hexadecimal aleatório. Supondo que o PRNG do seu idioma seja perfeito, todas as saídas válidas devem ter a mesma probabilidade de serem geradas.
TL; DR
Gere 32 dígitos hexadecimais aleatórios nos dígitos do formulário 8-4-4-4-12
. O menor código vence.
EDIT: deve ser hexadecimal. Sempre gerar apenas decimal é inválido. EDIT 2: Sem embutidos. Estes não são GUIDs, apenas dígitos hexadecimais genéricos.
Exemplo de saída:
ab13901d-5e93-1c7d-49c7-f1d67ef09198
7f7314ca-3504-3860-236b-cface7891277
dbf88932-70c7-9ae7-b9a4-f3df1740fc9c
c3f5e449-6d8c-afe3-acc9-47ef50e7e7ae
e9a77b51-6e20-79bd-3ee9-1566a95d9ef7
7b10e43c-3c57-48ed-a72a-f2b838d8374b
As brechas de entrada e padrão não são permitidas.
Isso é código-golfe , então o código mais curto vence. Além disso, fique à vontade para pedir esclarecimentos.
12345678-1234-1234-1234-123456789012
deve ser um UUID válido (ou é necessário um dígito hexadecimal?). Você considera isso uma brecha?xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
ondey
está um deles[89AB]
. No momento deste comentário, nenhuma das respostas (exceto C # usando uma biblioteca interna) tem garantia de produzir um UUID aleatório válido (e, na verdade, provavelmente não produzirá um).Respostas:
Pitão, 20 bytes
Demonstração.
Codifica
[1, 0, 0, 0, 2]
como 83 na base 3, depois adiciona um e multiplica por quatro para obter o comprimento de cada segmento. Em seguida, cria dígitos hexadecimais e se junta a hífens.fonte
Julia, 80 bytes
Gere um número inteiro aleatório de 128 bits, obtenha sua representação hexidecimal como uma string preenchida com 32 dígitos e divida-a em segmentos unidos por traços.
Obrigado a ConfusedMr_C e kvill pela ajuda!
fonte
CJam,
2625 bytesExperimente on-line no intérprete CJam .
Como funciona
fonte
PowerShell,
776967 byteseditar: parênteses estranhos:
edit: conseguiu remover o .Trim à direita ("-") do original:
Pode ser mais claro com algum espaço em branco, dada a natureza dos sinalizadores (-f e -Join). Eu ainda gostaria de perder o Trim final ("-"):
Ou, usando a funcionalidade interna (use a resposta C # acima)
No entanto, parece um pequeno atalho-y, mesmo que ele chegue aos 31 bytes.
fonte
(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
Python 2,
8684 bytesIsso acopla os formatadores de string para fazer com que o Python formate os números hexadecimais exclusivamente para cada segmento.
Ungolfed:
Isso poderia melhorar, mas estou orgulhoso.
fonte
Perl 5 , 43 bytes
Guardado 2 bytes graças a @Xcali !
Experimente online!
fonte
PHP, 69
7275bytesIsso não gera dígitos hexadecimais (
a
, ...f
). Eles são permitidos, mas não exigidos pelo corpo da pergunta.Nenhum grupo de dígitos começa com
0
(também não é necessário).edit: salvou 3 bytes graças a @IsmaelMiguel
fonte
join()
lugar.C #, 65 bytes
editar: Sim! C # é mais curto que outra linguagem (além de Java) :)
fonte
CreateUUID[]
!gawk, 86
Você pode usar isso uma vez a cada segundo para gerar um "UUID" aleatório exclusivo. Isso ocorre porque
srand()
usa o tempo do sistema em segundos desde a época como argumento, se não houver argumento.Eu acho que a parte awk é bastante elegante.
Se você quiser usá-lo com mais frequência do que uma vez a cada segundo, pode chamá-lo no bash assim. Observe que a parte awk também foi alterada.
O
echo
é adicionado lá para imprimir uma nova linha de cada vez.fonte
K5, 35 bytes
Para gerar um alfabeto hexadecimal, giro uma sequência de caracteres (
`c$
) a partir de uma lista de dígitos (48+!10
) e as 6 primeiras letras maiúsculas (65+!6
). É uma maneira alternativa de gerar os dígitos com o mesmo comprimento,/$!10
.Com a sequência "0123456789ABCDEF" gerada, o resto é simples. Selecione 32 valores aleatórios desse conjunto (
32?
), corte (_
) a sequência resultante em0 8 12 16 20
computada via(0,8+4*!4)
e, em seguida, junte os fragmentos da sequência resultante com traços ("-"/
).Em ação:
fonte
R , 63 bytes
Experimente online!
O código primeiro cria uma seqüência aleatória de 36 caracteres e, em seguida, coloca os quatro hífens. Ele gera um UUID para stdout.
fonte
c
chamadasprintf("%x",0:15)
por -1.JavaScript, ES6, 106 bytes
Usa substituição de Regex. Trata a string de formato como uma contagem para gerar um caractere hexadecimal. Içando sempre que posso; omitindo ponto e vírgula sempre que possível.
fonte
'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
Perl 6 , 53 bytes
O óbvio:
A tradução do exemplo do Perl 5 usando
printf
resulta em código um pouco mais curto.fonte
(0..16⁴)
?! Você pode fazer isso no Perl?1,2,4,8,16 ... *
o que gera uma lista infinita preguiçoso das potências de 2. ({2**$++} ... *
também funciona)Kotlin , 175 bytes
Experimente online!
Meu primeiro programa Kotlin e envio de PPCG
fonte
APL (Dyalog Unicode) ,
11578 bytesExperimente online!
Este é o meu primeiro envio de APL. Um enorme obrigado a @ Adám por me acompanhar no chat do PPCG no APL e pela função de conversão hexadecimal.
Obrigado a @ Zacharý por 1 byte
Editado para corrigir a contagem de bytes.
fonte
⎕IO←0
, sem custo de bytes, Adám faz isso muito. Além disso, a maioria dos bytes (IIRC, todos os que você possui aqui) pode ser contada como um no APL.a(H 12?16)
paraa H 12?16
salvar um byte.'-'@(+\9,3⍴5)⊢(⎕D,819⌶⎕A)[?36⍴16]
ou'-'@(+\9,3⍴5)∊⌂hex?18⍴256
Japonês , 32 bytes
Experimente online!
fonte
m@
-£
, por exemplo) e, para ajudar você a começar, aqui está uma versão de 24 bytes de sua solução às pressas : ethproductions.github.io/japt/… Entre na sala de chat do Japt se tiver alguma dúvida.MATLAB / oitava, 95 bytes
fonte
Perl , 51 bytes
Requer perl5> = 5,10, eu acho. Para o modificador / r e para say ().
fonte
s//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/eg
uso de-p
sinalizador, também significa que ele funciona em versões mais antigas sem-E
.-p
), mas ainda assim muito bom e eu não consideraria essa abordagem sem ver sua resposta!J ,
42 39 3727 bytesExperimente online!
fonte
C ++,
194193221210201 bytes+7 bytes graças a Zacharý (detectou um
-
que não deveria estar no final)Se alguém tiver uma maneira de obter um valor diferente a cada execução, sem alterar
srand
e sem incluir<ctime>
, isso seria ótimofonte
#define L(a) for
ser#define L(a)for...
? (Já poderia ter perguntado isso)"0123456789abcdef"[rand()%16]
e depois removerf
?Befunge-93 , 97 bytes
Experimente online!
Tenho certeza que isso pode ser reduzido, mas esta é minha primeira tentativa :)
fonte
Bash, 67 bytes
fonte
JavaScript REPL, 79 bytes
Experimente online!
Math.random
pode retornar0
. A adição de 5 zeros faz com que a fatia obtenha 40
sfonte
Quarto (gforth) ,
9189 bytesExperimente online!
Explicação
Altera a base para hexadecimal e gera números / segmentos do comprimento apropriado com traços em intervalos especificados
Código Explicação
fonte
C (gcc) ,
949186 bytesExperimente online!
Gostaria de sugerir esta versão em um comentário para Max Yekhlakov ( sua resposta ), mas infelizmente ainda não tenho os 50 pontos de reputação necessários, então aqui está a minha resposta.
803912
estáC4448
em hexadecimal, descreve como a saída deve ser formatada (12-4-4-4-8
), é revertida porque os dígitos menos significativos serão lidos primeiro.Editar% s:
srand(time(0))
porsrand(&i)
fonte
main(){...;int i=
pode sermain(i){...;i=
.srand()
aceite umunsigned int
como seu parâmetro de semente. No tio.run, umunsigned int
tem 4 bytes, mas o UUID tem 16 bytes. Isso significa que apenas uma pequena fração das saídas válidas (1/2 ^ 12) será gerada, portanto, minha solução (assim como a anterior comtime(0)
) não é válida. O que você acha ?Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.
. A entropia de sementes não determina necessariamente a entropia de RNG, embora provavelmente o faça (não verificou asrand()
implementação). No entanto,srand()
é do meu conhecimento razoavelmente uniforme, portanto, se o RNG fosse perfeito, ainda seria uniforme. Portanto, acho que sua resposta é válida.srand()
que já tenha sido feito e, neste caso, não haverá dúvida. Mas eu não tenho certeza se isso é permitido, outros C submissões / C ++ todos parecem incluemsrand()
int a resposta (a menos que ele não usarand()
)C (gcc),
1431101039694 bytesJogou até 94 bytes graças a ceilingcat e Jonathan Frech.
Experimente online!
Explicação:
fonte
*z=L"\27\23\17\vz"
vez de*z=L"\10\4\4\4\14"
e emfor(n=32;n--;z+=printf("-%x"+(n!=*z),P()&15)-1)
vez defor(;*z;*++z&&putchar(45))for(n=*z;n--;printf("%x",P()&15))
Java com pólo a laser de dez pés v. 1.06, 126 bytes
Testado com a versão 1.06 da biblioteca, mas isso deve funcionar com qualquer versão 1.04 ou mais recente.
fonte
Gelatina , 17 bytes
Experimente online!
fonte
SmileBASIC,
6562 bytesEu criei uma função para imprimir 4 dígitos hexadecimais aleatórios:
DEF H?HEX$(RND(65536),4);:END
assim como 4 dígitos com um-
após elasDEF G:H?"-";:END
. Depois, basta chamar essas funções várias vezes.fonte
Chip , 109 + 6 = 115 bytes
Requer sinalizadores
-wc36
, causando +6 bytesExperimente online!
Gera 4 bits aleatórios (os quatro
?
) e converte em dígitos hexadecimais:0x0
-0x9
=>0
-9
0xa
-0xe
=>b
-f
0xf
=>a
... um pouco não convencional, mas me salvou alguns bytes sem custos para a distribuição dos resultados.
fonte