diff --git a/cake/libs/string.php b/cake/libs/string.php index bda87238d..a85db0065 100644 --- a/cake/libs/string.php +++ b/cake/libs/string.php @@ -85,26 +85,49 @@ class String extends Object { */ function uuid() { $node = env('SERVER_ADDR'); + $pid = null; - if(empty($node)) { + if (strpos($node, ':') !== false) { + if (substr_count($node, '::')) { + $node = str_replace('::', str_repeat(':0000', 8 - substr_count($node, ':')) . ':', $node); + } + $node = explode(':', $node) ; + $ipv6 = '' ; + + foreach ($node as $id) { + $ipv6 .= str_pad(base_convert($id, 16, 2), 16, 0, STR_PAD_LEFT); + } + $node = base_convert($ipv6, 2, 10); + + if (strlen($node) < 38) { + $node = null; + } else { + $node = crc32($node); + } + } elseif (empty($node)) { $host = env('HOSTNAME'); if (empty($host)) { $host = env('HOST'); } - if (empty($host)) { - $node = ip2long('127.0.0.1'); - } else { + if (!empty($host)) { $ip = gethostbyname($host); + if ($ip === $host) { $node = crc32($host); } else { $node = ip2long($ip); } } - } else { + } elseif ($node !== '127.0.0.1') { $node = ip2long($node); + } else { + $node = null; + } + + if (empty($node)) { + $node = crc32(Configure::read('Security.salt')); } if (function_exists('zend_thread_id')) { @@ -113,9 +136,14 @@ class String extends Object { $pid = getmypid(); } + if (!$pid) { + $pid = mt_rand(0, 0xfff) | 0x4000; + } + list($timeMid, $timeLow) = explode(' ', microtime()); $uuid = sprintf("%08x-%04x-%04x-%02x%02x-%04x%08x", (int)$timeLow, (int)substr($timeMid, 2) & 0xffff, - mt_rand(0, 0xfff) | 0x4000, mt_rand(0, 0x3f) | 0x80, mt_rand(0, 0xff), $pid, $node); + mt_rand(0, 0xfff) | 0x4000, mt_rand(0, 0x3f) | 0x80, mt_rand(0, 0xff), substr($pid, 0, 5), $node); + return $uuid; } /**