PHP的 uuid生成(CI版本)

By | 2015 年 10 月 5 日
<?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

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据