PHP function to generate v4 UUID PHP function to generate v4 UUID php php

PHP function to generate v4 UUID


Instead of breaking it down into individual fields, it's easier to generate a random block of data and change the individual byte positions. You should also use a better random number generator than mt_rand().

According to RFC 4122 - Section 4.4, you need to change these fields:

  1. time_hi_and_version (bits 4-7 of 7th octet),
  2. clock_seq_hi_and_reserved (bit 6 & 7 of 9th octet)

All of the other 122 bits should be sufficiently random.

The following approach generates 128 bits of random data using openssl_random_pseudo_bytes(), makes the permutations on the octets and then uses bin2hex() and vsprintf() to do the final formatting.

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

With PHP 7, generating random byte sequences is even simpler using random_bytes():

function guidv4($data = null){    $data = $data ?? random_bytes(16);    // ...}


Taken from this comment on the PHP manual, you could use this:

function gen_uuid() {    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',        // 32 bits for "time_low"        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),        // 16 bits for "time_mid"        mt_rand( 0, 0xffff ),        // 16 bits for "time_hi_and_version",        // four most significant bits holds version number 4        mt_rand( 0, 0x0fff ) | 0x4000,        // 16 bits, 8 bits for "clk_seq_hi_res",        // 8 bits for "clk_seq_low",        // two most significant bits holds zero and one for variant DCE1.1        mt_rand( 0, 0x3fff ) | 0x8000,        // 48 bits for "node"        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )    );}


Anyone using composer dependencies, you might want to consider this library: https://github.com/ramsey/uuid

It doesn't get any easier than this:

Uuid::uuid4();