<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* UUID Class
*
* This implements the abilities to create UUID's for CodeIgniter.
* Code has been borrowed from the followinf comments on php.net
* and has been optimized for CodeIgniter use.
* http://www.php.net/manual/en/function.uniqid.php#94959
*
* @category Libraries
* @author Dan Storm
* @link http://catalystcode.net/
* @license GNU LPGL
* @version 2.1
*/
class Uuid
{
public function v3($name, $namespace = null)
{
if(is_null($namespace))
$namespace = $this->v4();
if(empty($name))
return FALSE;
if( ! $this->is_valid($namespace))
return FALSE;
// Get hexadecimal components of namespace
$nhex = str_replace(array('-','{','}'), '', $namespace);
// Binary Value
$nstr = '';
// Convert Namespace UUID to bits
for($i = 0; $i < strlen($nhex); $i+=2)
{
$nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
}
// Calculate hash value
$hash = md5($nstr . $name);
return sprintf('%08s-%04s-%04x-%04x-%12s',
// 32 bits for "time_low"
substr($hash, 0, 8),
// 16 bits for "time_mid"
substr($hash, 8, 4),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 3
(hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x3000,
// 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
(hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,
// 48 bits for "node"
substr($hash, 20, 12)
);
}
public function v4($trim = false)
{
$format = ($trim == false) ? '%04x%04x-%04x-%04x-%04x-%04x%04x%04x' : '%04x%04x%04x%04x%04x%04x%04x%04x';
return sprintf($format,
// 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)
);
}
public function v5($name, $namespace = null)
{
if(is_null($namespace))
$namespace = $this->v4();
if(empty($name))
return FALSE;
if( ! $this->is_valid($namespace))
return FALSE;
// Get hexadecimal components of namespace
$nhex = str_replace(array('-','{','}'), '', $namespace);
// Binary Value
$nstr = '';
// Convert Namespace UUID to bits
for($i = 0; $i < strlen($nhex); $i+=2)
{
$nstr .= chr(hexdec($nhex[$i].$nhex[$i+1]));
}
// Calculate hash value
$hash = sha1($nstr . $name);
return sprintf('%08s-%04s-%04x-%04x-%12s',
// 32 bits for "time_low"
substr($hash, 0, 8),
// 16 bits for "time_mid"
substr($hash, 8, 4),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 5
(hexdec(substr($hash, 12, 4)) & 0x0fff) | 0x5000,
// 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
(hexdec(substr($hash, 16, 4)) & 0x3fff) | 0x8000,
// 48 bits for "node"
substr($hash, 20, 12)
);
}
public function is_valid($uuid)
{
return preg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i', $uuid) === 1;
}
}
CodeIgniter-UUID
CodeIgniter-UUID is a CodeIgniter library enables you to create UUID's within CodeIgniter. Supported versions of UUID is v4 (random), v3 (MD5 hash) and v5 (SHA-1 hash).
Usage
//Output a v4 UUID
echo $this->uuid->v4();
//Output a v3 UUID from a name and namespace (if a valid UUID namespace is omitted, a v4 generated UUID will be used)
echo $this->uuid->v3('My Name', '8d3dc6d8-3a0d-4c03-8a04-1155445658f7');
echo $this->uuid->v3('My Name');
//Output a v5 UUID from a name and namespace (if a valid UUID namespace is omitted, a v4 generated UUID will be used)
echo $this->uuid->v5('My Name', '8d3dc6d8-3a0d-4c03-8a04-1155445658f7');
echo $this->uuid->v5('My Name');
For information on UUID, take a look at the following URL:http://en.wikipedia.org/wiki/Universally_unique_identifier