Home » Php » php – How to generate a new GUID?

php – How to generate a new GUID?

Posted by: admin April 23, 2020 Leave a comment


I’m working on a web service which requires a new GUID() passed as a reference to a method within the service.

I am not familiar with C# or the GUID() object, but require something similar for PHP (so create a new object which from my understanding returns an empty/blank GUID).

Any ideas?

How to&Answers:

You can try the following:

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));

Source – com_create_guid


As an alternative to the above options:

$guid = bin2hex(openssl_random_pseudo_bytes(16));

It gives a string like 412ab7489d8b332b17a2ae127058f4eb


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));

GUID Generator


According to Is there any difference between a GUID and a UUID?

GUID is Microsoft’s implementation of the UUID standard.

So, here’s a link to libraries, that let’s you create UUIDs of the following types:

  • version 1 (time-based)
  • version 3 (name-based and hashed with MD5)
  • version 4 (random)
  • version 5 (name-based and hashed with SHA1)


I don’t know exactly, which one C# is using, but that’s at least something you can use if you’re writing some piece of software and want to have universal unique identifiers.

My perfered choice was https://github.com/fredriklindberg/class.uuid.php because it is just a simple PHP file and the most rated one (https://github.com/ramsey/uuid) had to much dependencies on other libraries, but his may change soon (see https://github.com/ramsey/uuid/issues/20).

But if you really need a GUID (according to the Microsoft standard), they have a different generation process than these 4122. Wikipedia claims that

GUIDs and RFC 4122 UUIDs should be identical when displayed textually


In most cases, you should be fine by going for one of the PHP libs for UUIDs. I don’t think you’re meddling with Microsoft Component Object Model (COM), don’t you?


For googlers such as my self,
I found this snipet more accurate:

function getGUID(){
    if (function_exists('com_create_guid')){
        return com_create_guid();
        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
            .chr(125);// "}"
        return $uuid;

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


If you just need a very unique ID:

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

If ID’s are generated more than 1 millisecond apart, they are 100% unique.

If two ID’s are generated at shorter intervals, this would generate ID’s that are 99.999999999999999999% likely to be globally unique (collision in 1 of 10^18)

You can increase this number by adding more digits, but to generate 100% unique ID’s you will need to use a global counter.

if you really do need RFC compliance, this will pass as a valid version 4 GUID:

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

This follows the intention, but not the letter of the RFC. Among other discrepancies it’s a few random digits short. (Add more random digits if you need it) The upside is that this is fast, compared to 100% compliant code. You can test your GUID here