2015-08-17 17:00:26 -07:00
< ? php
namespace Drupal\Component\Uuid ;
use Drupal\Component\Utility\Crypt ;
/**
2016-04-07 11:19:57 -07:00
* Generates a UUID v4 ( RFC 4122 section 4.4 ) using PHP code .
2015-08-17 17:00:26 -07:00
*
2016-04-07 11:19:57 -07:00
* @ see http :// www . rfc - editor . org / rfc / rfc4122 . txt
* @ see http :// www . rfc - editor . org / errata_search . php ? rfc = 4122 & eid = 3546
2015-08-17 17:00:26 -07:00
*/
class Php implements UuidInterface {
/**
* { @ inheritdoc }
*/
public function generate () {
2016-04-07 11:19:57 -07:00
// Obtain a random string of 32 hex characters.
$hex = bin2hex ( Crypt :: randomBytes ( 16 ));
// The variable names $time_low, $time_mid, $time_hi_and_version,
// $clock_seq_hi_and_reserved, $clock_seq_low, and $node correlate to
// the fields defined in RFC 4122 section 4.1.2.
//
// Use characters 0-11 to generate 32-bit $time_low and 16-bit $time_mid.
2015-08-17 17:00:26 -07:00
$time_low = substr ( $hex , 0 , 8 );
$time_mid = substr ( $hex , 8 , 4 );
2016-04-07 11:19:57 -07:00
// Use characters 12-15 to generate 16-bit $time_hi_and_version.
// The 4 most significant bits are the version number (0100 == 0x4).
// We simply skip character 12 from $hex, and concatenate the strings.
$time_hi_and_version = '4' . substr ( $hex , 13 , 3 );
// Use characters 16-17 to generate 8-bit $clock_seq_hi_and_reserved.
// The 2 most significant bits are set to one and zero respectively.
$clock_seq_hi_and_reserved = base_convert ( substr ( $hex , 16 , 2 ), 16 , 10 );
$clock_seq_hi_and_reserved &= 0 b00111111 ;
$clock_seq_hi_and_reserved |= 0 b10000000 ;
// Use characters 18-19 to generate 8-bit $clock_seq_low.
$clock_seq_low = substr ( $hex , 18 , 2 );
// Use characters 20-31 to generate 48-bit $node.
$node = substr ( $hex , 20 );
// Re-combine as a UUID. $clock_seq_hi_and_reserved is still an integer.
$uuid = sprintf ( '%s-%s-%s-%02x%s-%s' ,
$time_low , $time_mid , $time_hi_and_version ,
$clock_seq_hi_and_reserved , $clock_seq_low ,
$node
);
2015-08-17 17:00:26 -07:00
return $uuid ;
}
}