J'ai donc fait quelques recherches et j'ai essayé de reconstituer une fonction qui génère un UUID v4 valide en PHP. C'est le plus proche que j'ai pu venir. Mes connaissances en hexadécimal, décimal, binaire, opérateurs bit à bit de PHP et similaires sont presque inexistantes. Cette fonction génère un UUID v4 valide jusqu'à une zone. Un UUID v4 doit se présenter sous la forme de:
xxxxxxxx-xxxx- 4 xxx- y xxx-xxxxxxxxxxxx
où y est 8, 9, A ou B. C'est là que les fonctions échouent car elles n'y adhèrent pas.
J'espérais que quelqu'un avec plus de connaissances que moi dans ce domaine pourrait me donner un coup de main et m'aider à corriger cette fonction pour qu'elle respecte cette règle.
La fonction est la suivante:
<?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;
}
?>
Merci à tous ceux qui peuvent m'aider.
$newId = exec('uuidgen -r');
Réponses:
Tiré de ce commentaire sur le manuel PHP, vous pouvez utiliser ceci:
la source
Au lieu de le décomposer en champs individuels, il est plus facile de générer un bloc de données aléatoire et de modifier les positions d'octets individuelles. Vous devriez également utiliser un meilleur générateur de nombres aléatoires que mt_rand ().
Selon RFC 4122 - Section 4.4 , vous devez modifier ces champs:
time_hi_and_version
(bits 4-7 du 7e octet),clock_seq_hi_and_reserved
(bits 6 et 7 du 9e octet)Tous les 122 autres bits doivent être suffisamment aléatoires.
L'approche suivante génère 128 bits de données aléatoires en utilisant
openssl_random_pseudo_bytes()
, effectue les permutations sur les octets, puis utilisebin2hex()
etvsprintf()
pour effectuer le formatage final.Avec PHP 7, la génération de séquences d'octets aléatoires est encore plus simple en utilisant
random_bytes()
:la source
$data = file_get_contents('/dev/urandom', NULL, NULL, 0, 16);
$data = $data ?? random_bytes( 16 );
vous pouvez maintenant spécifier votre propre source de données aléatoire ou laisser la fonction le faire pour vous. :-)Quiconque utilise des dépendances de compositeur , vous voudrez peut-être envisager cette bibliothèque: https://github.com/ramsey/uuid
Ce n'est pas plus simple que ça:
la source
sur les systèmes unix, utilisez le noyau du système pour générer un uuid pour vous.
Credit Samveen sur https://serverfault.com/a/529319/210994
la source
/dev/random
qui bloque si le pool d'entropie est épuisé./dev/urandom
, qui, à ma connaissance, ne s'épuiserait pas, mais risque de renvoyer des uuids en double. Je suppose que c'est un compromis; avez-vous vraiment besoin d'un identifiant unique influencé par l'entropie du système?Dans ma recherche d'une création d'un uuid v4, je suis d'abord arrivé sur cette page, puis j'ai trouvé ceci sur http://php.net/manual/en/function.com-create-guid.php
crédit: pavel.volyntsev
Edit: pour clarifier, cette fonction vous donnera toujours un uuid v4 (PHP> = 5.3.0).
Lorsque la fonction com_create_guid est disponible (généralement uniquement sous Windows), elle l'utilisera et supprimera les accolades.
S'il n'est pas présent (Linux), il se rabattra sur cette fonction opensl_random_pseudo_bytes aléatoire forte, il utilisera ensuite vsprintf pour le formater en uuid v4.
la source
Ma réponse est basée sur le commentaire d' un utilisateur uniqid mais utilise la fonction openssl_random_pseudo_bytes pour générer une chaîne aléatoire au lieu de lire à partir de
/dev/urandom
la source
Si vous utilisez,
CakePHP
vous pouvez utiliser leur méthodeCakeText::uuid();
de la classe CakeText pour générer un uuid RFC4122.la source
Une légère variation sur la réponse de Jack pour ajouter le support de PHP <7:
la source
Inspiré par broofa réponse de là .
Ou en cas d'impossibilité d'utiliser des fonctions anonymes.
la source
mt_rand()
que le caractère aléatoire n'est pas garanti.Après avoir recherché exactement la même chose et presque implémenté une version de cela moi-même, j'ai pensé qu'il valait la peine de mentionner que, si vous le faites dans un cadre WordPress , WP a sa propre fonction très pratique pour exactement cela:
$myUUID = wp_generate_uuid4();
Vous pouvez lire la description et la source ici .
la source
false
🤷Que diriez-vous d'utiliser mysql pour générer l'uuid pour vous?
la source
UUID()
fonction de MySQL crée des uuids v1.la source
De tom, sur http://www.php.net/manual/en/function.uniqid.php
la source
/dev/urandom
devrait être bien -/dev/random
ne devrait être utilisé que pour la génération de clés cryptographiques à long terme.mt_rand()
si rien de plus sophistiqué n'est disponible.random_bytes()
en PHP 7 et c'est parti :-)Je suis sûr qu'il existe une façon plus élégante de faire la conversion de binaire en décimal pour les portions
4xxx
etyxxx
. Mais si vous souhaitez l'utiliseropenssl_random_pseudo_bytes
comme générateur de nombres sécurisé sur le plan cryptographique, voici ce que j'utilise:la source
Utiliser Symfony Polyfill / Uuid
Ensuite, vous pouvez simplement générer uuid comme fonction php native:
Pour en savoir plus, lisez le post officiel de Blop Symfony - https://symfony.com/blog/introducing-the-new-symfony-uuid-polyfill
la source