web-dev-qa-db-fra.com

Comment générer un nouveau GUID?

Je travaille sur un service Web qui nécessite une nouvelle GUID() passée comme référence à une méthode au sein du service.

Je ne suis pas familier avec C# Ou la GUID() object, mais j'ai besoin de quelque chose de similaire pour PHP (donc créez un nouvel objet qui, d'après ma compréhension, renvoie un empty/blank GUID ).

Des idées?

31
mauzilla

Vous pouvez essayer ce qui suit:

function GUID()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_Rand(0, 65535), mt_Rand(0, 65535), mt_Rand(0, 65535), mt_Rand(16384, 20479), mt_Rand(32768, 49151), mt_Rand(0, 65535), mt_Rand(0, 65535), mt_Rand(0, 65535));
}

La source - com_create_guid

39
Michel Ayres

Comme alternative aux options ci-dessus:

$guid = bin2hex(openssl_random_pseudo_bytes(16));

Il donne une chaîne comme 412ab7489d8b332b17a2ae127058f4eb

12
Alexey
<?php
function guid(){
if (function_exists('com_create_guid') === true)
    return trim(com_create_guid(), '{}');

$data = openssl_random_pseudo_bytes(16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40);
$data[8] = chr(ord($data[8]) & 0x3f | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
?>

Générateur de GUID

5
user8240385

Selon Y a-t-il une différence entre un GUID et un UUID?

GUID est l'implémentation par Microsoft de la norme UUID.

Voici donc un lien vers les bibliothèques, qui vous permet de créer des UUID des types suivants:

  • version 1 (temporelle)
  • version 3 (basée sur le nom et hachée avec MD5)
  • version 4 (aléatoire)
  • version 5 (basée sur le nom et hachée avec SHA1)

https://github.com/search?p=1&q=uuid+php&ref=cmdform&type=Repositories

Je ne sais pas exactement quel C # utilise, mais c'est au moins quelque chose que vous pouvez utiliser si vous écrivez un logiciel et que vous voulez avoir des identifiants uniques universels.

Mon choix préféré était https://github.com/fredriklindberg/class.uuid.php car il s'agit simplement d'un simple fichier PHP et le plus apprécié (- https://github.com/ramsey/uuid ) avait beaucoup de dépendances sur d'autres bibliothèques, mais son pourrait changer bientôt (voir https://github.com/ramsey/uuid/issues/2 ).

Mais si vous avez vraiment besoin d'un GUID (selon la norme Microsoft), ils ont un processus de génération différent de ces 4122. Wikipedia affirme que

Les GUID et les UUID RFC 4122 doivent être identiques lorsqu'ils sont affichés textuellement

http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Binary_encoding

Dans la plupart des cas, vous devriez aller bien pour l'une des bibliothèques PHP pour les UUID. Je ne pense pas que vous vous mêlez de Microsoft Component Object Modèle (COM) , n'est-ce pas?

4
SimonSimCity

Pour les googleurs comme moi, j'ai trouvé ce snipet plus précis:

function getGUID(){
    if (function_exists('com_create_guid')){
        return com_create_guid();
    }else{
        mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(Rand(), true)));
        $hyphen = chr(45);// "-"
        $uuid = chr(123)// "{"
            .substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12)
            .chr(125);// "}"
        return $uuid;
    }
}

source http://guid.us/GUID/PHP

3
Muhammad Naderi

Si vous avez juste besoin d'un identifiant très unique:

$uid = dechex( microtime(true) * 1000 ) . bin2hex( random_bytes(8) );

Si les ID sont générés à plus d'une milliseconde d'intervalle, ils sont 100% uniques.

Si deux identifiants sont générés à des intervalles plus courts, cela générerait des identifiants 99,99999999999999999999% susceptibles d'être uniques au monde (collision dans 1 sur 10 ^ 18)

Vous pouvez augmenter ce nombre en ajoutant plus de chiffres, mais pour générer des identifiants 100% uniques, vous devrez utiliser un compteur global.

si vous avez vraiment besoin de la conformité RFC, cela passera comme un GUID valide de la version 4:

$guid = vsprintf('%s%s-%s-4000-8%.3s-%s%s%s0',str_split(dechex( microtime(true) * 1000 ) . bin2hex( random_bytes(8) ),4));

Cela suit l'intention, mais pas la lettre du RFC. Parmi les autres écarts, il s'agit de quelques chiffres aléatoires. (Ajoutez plus de chiffres aléatoires si vous en avez besoin) L'avantage est que c'est rapide, comparé au code 100% conforme. Vous pouvez tester votre GUID ici

1
Simon Rigét