Então, eu tenho pesquisado bastante e tenho tentado reunir uma função que gera um UUID v4 válido em PHP. Este é o mais próximo que pude chegar. Meu conhecimento em operadores hexadecimais, decimais, binários, bit a bit do PHP e similares é quase inexistente. Esta função gera um UUID v4 válido até uma área. Um UUID v4 deve estar na forma de:
xxxxxxxx-xxxx- 4 xxx- y xxx-xxxxxxxxxxxxxx
onde y é 8, 9, A ou B. É aqui que as funções falham, pois não aderem a isso.
Eu esperava que alguém com mais conhecimento do que eu nesta área pudesse me ajudar e consertar essa função para que ela cumprisse essa regra.
A função é a seguinte:
<?php
function gen_uuid() {
$uuid = array(
'time_low' => 0,
'time_mid' => 0,
'time_hi' => 0,
'clock_seq_hi' => 0,
'clock_seq_low' => 0,
'node' => array()
);
$uuid['time_low'] = mt_rand(0, 0xffff) + (mt_rand(0, 0xffff) << 16);
$uuid['time_mid'] = mt_rand(0, 0xffff);
$uuid['time_hi'] = (4 << 12) | (mt_rand(0, 0x1000));
$uuid['clock_seq_hi'] = (1 << 7) | (mt_rand(0, 128));
$uuid['clock_seq_low'] = mt_rand(0, 255);
for ($i = 0; $i < 6; $i++) {
$uuid['node'][$i] = mt_rand(0, 255);
}
$uuid = sprintf('%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
$uuid['time_low'],
$uuid['time_mid'],
$uuid['time_hi'],
$uuid['clock_seq_hi'],
$uuid['clock_seq_low'],
$uuid['node'][0],
$uuid['node'][1],
$uuid['node'][2],
$uuid['node'][3],
$uuid['node'][4],
$uuid['node'][5]
);
return $uuid;
}
?>
Agradeço a qualquer um que possa me ajudar.
$newId = exec('uuidgen -r');
Respostas:
Retirado deste comentário no manual do PHP, você poderia usar o seguinte:
fonte
Em vez de dividi-lo em campos individuais, é mais fácil gerar um bloco aleatório de dados e alterar as posições de bytes individuais. Você também deve usar um gerador de números aleatórios melhor que o mt_rand ().
De acordo com a RFC 4122 - Seção 4.4 , você precisa alterar estes campos:
time_hi_and_version
(bits 4-7 do 7º octeto),clock_seq_hi_and_reserved
(bits 6 e 7 do 9º octeto)Todos os outros 122 bits devem ser suficientemente aleatórios.
A abordagem a seguir gera 128 bits de dados aleatórios usando
openssl_random_pseudo_bytes()
, faz as permutações nos octetos e depois usabin2hex()
evsprintf()
faz a formatação final.Com o PHP 7, gerar sequências aleatórias de bytes é ainda mais simples usando
random_bytes()
:fonte
$data = file_get_contents('/dev/urandom', NULL, NULL, 0, 16);
$data = $data ?? random_bytes( 16 );
Agora você pode especificar sua própria fonte de dados aleatória ou deixar a função fazer isso por você. :-)Qualquer pessoa que utilize dependências do compositor , convém considerar esta biblioteca: https://github.com/ramsey/uuid
Não fica mais fácil do que isso:
fonte
em sistemas unix, use o kernel do sistema para gerar um uuid para você.
Crédito Samveen em https://serverfault.com/a/529319/210994
fonte
/dev/random
que bloqueia se o pool de entropia estiver esgotado./dev/urandom
, o que, no meu entendimento, não esgotaria, mas correria o risco de retornar uuids duplicados. Eu acho que é uma troca; você realmente precisa de uma identificação única influenciada pela entropia do sistema?Na minha pesquisa para criar um uuid v4, cheguei primeiro a esta página e depois o encontrei em http://php.net/manual/en/function.com-create-guid.php
crédito: pavel.volyntsev
Edit: para esclarecer, esta função sempre fornecerá um uuid v4 (PHP> = 5.3.0).
Quando a função com_create_guid estiver disponível (geralmente apenas no Windows), ela será usada e eliminará os chavetas.
Se não estiver presente (Linux), ele retornará a essa forte função openssl_random_pseudo_bytes aleatória e, em seguida, usará o vsprintf para formatá-lo no v4 uuid.
fonte
Minha resposta é baseada no comentário uniqid user comment, mas ele usa a função openssl_random_pseudo_bytes para gerar uma sequência aleatória em vez de ler a partir de
/dev/urandom
fonte
Se você usar,
CakePHP
poderá usar o métodoCakeText::uuid();
da classe CakeText para gerar um uuid RFC4122.fonte
Uma pequena variação na resposta de Jack para adicionar suporte ao PHP <7:
fonte
Inspirado pela resposta de broofa aqui .
Ou se não for possível usar funções anônimas.
fonte
mt_rand()
não há aleatoriedade garantida.Tendo pesquisado exatamente a mesma coisa e quase implementando uma versão disso, pensei que valeria a pena mencionar que, se você estiver fazendo isso dentro de uma estrutura do WordPress , o WP terá sua própria função super útil para exatamente isso:
$myUUID = wp_generate_uuid4();
Você pode ler a descrição e a fonte aqui .
fonte
false
🤷Que tal usar o mysql para gerar o uuid para você?
fonte
UUID()
função do MySQL cria uuids v1.fonte
De tom, em http://www.php.net/manual/en/function.uniqid.php
fonte
/dev/urandom
deve ser bom -/dev/random
só deve ser usado para geração de chaves criptográficas de longo prazo.mt_rand()
se nada mais sofisticado estiver disponível.random_bytes()
no PHP 7 eTenho certeza de que há uma maneira mais elegante de fazer a conversão de binário em decimal para as porções
4xxx
eyxxx
. Mas se você deseja usaropenssl_random_pseudo_bytes
como seu gerador de números criptograficamente seguro, é isso que eu uso:fonte
Use o Symfony Polyfill / Uuid
Então você pode apenas gerar o uuid como função php nativa:
Mais sobre isso, leia na publicação oficial do Symfony no blop - https://symfony.com/blog/introducing-the-new-symfony-uuid-polyfill
fonte