310 votes

Fonction PHP pour générer l’UUID de la v4

J'ai donc fait quelques recherches et je suis en train d'essayer de reconstituer une fonction qui génère un valide v4 UUID en PHP. C'est le plus proche que j'ai pu venir. Mes connaissances en hexadécimal, décimal, binaire, PHP opérateurs au niveau du bit et l'aime, c'est à peu près impossible. Cette fonction génère un valide v4 UUID jusqu'à une zone. Un v4 UUID doit être sous la forme de:

xxxxxxxx-xxxx-4xxx-oxxx xxxxxxxxxxxx

y est de 8, 9, A ou B. C'est là que les fonctions échoue car il ne veut pas adhérer à cela.

J'espérais que quelqu'un avec plus de connaissances que moi dans ce domaine pourrait me prêter un coup de main et m'aider à corriger cette fonction de sorte qu'il n'adhérer à 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;
}

?>

Grâce à quelqu'un qui peut m'aider.

449voto

Jack Points 88446

Au lieu de le décomposer en champs individuels, il est plus facile de générer de façon aléatoire un bloc de données et de changer le de chaque octet positions. Vous devez également utiliser un meilleur générateur de nombre aléatoire que la fonction mt_rand().

Selon la RFC 4122 - Section 4.4, vous devez modifier ces champs:

  1. time_hi_and_version (bits 4 à 7 de 7 octet),
  2. clock_seq_hi_and_reserved (bits 6 et 7 de 9 octet)

Tous les autres 122 bits devrait être assez aléatoire.

L'approche suivante génère 128 bits de données aléatoires à l'aide de openssl_random_pseudo_bytes(), rend les permutations sur les octets, puis utilise bin2hex() et vsprintf() faire la mise en forme finale.

function guidv4($data)
{
    assert(strlen($data) == 16);

    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10

    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}

echo guidv4(openssl_random_pseudo_bytes(16));

329voto

William Points 5801

Tiré de ce commentaire sur le manuel PHP, vous pouvez utiliser ceci :

153voto

djule5 Points 810

Toute personne utilisant le compositeur dépendances, vous pourriez vouloir considérer cette bibliothèque : https://github.com/ramsey/uuid

Il n’y a plus facile que cela :

39voto

ThorSummoner Points 396

sur les systèmes unix, utilisez le système kernal pour générer un uuid pour vous.

Crédit Samveen sur http://serverfault.com/a/529319/210994

Note ! : à l’aide de cette méthode pour obtenir un uuid épuise en fait l’entropie, très rapidement ! Je voudrais éviter l’utilisation de ce où il serait appelé fréquemment.

5voto

Victor Smirnov Points 582

Ma réponse est basée sur commentaire Commentaire utilisateur uniqid mais il utilise la fonction openssl_random_pseudo_bytes pour générer une chaîne aléatoire au lieu de la lecture d'``

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X