diff --git a/lib/uuid.php b/lib/uuid.php new file mode 100644 index 0000000000..93153504f2 --- /dev/null +++ b/lib/uuid.php @@ -0,0 +1,109 @@ +. + * + * @category UUID + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * UUID generation + * + * @category General + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class UUID +{ + protected $str = null; + + /** + * Constructor for a UUID + * + * Uses gen() to create a new UUID + */ + + function __construct() + { + $this->str = self::gen(); + } + + /** + * For serializing to a string + * + * @return string version of self + */ + + function __toString() + { + return $this->str; + } + + /** + * For serializing to a string + * + * @return string version of self + */ + + function getString() + { + return $this->str; + } + + /** + * Generate a new UUID + * + * @return 36-char v4 (random-ish) UUID + */ + + static function gen() + { + return sprintf('%s-%s-%04x-%04x-%s', + // 32 bits for "time_low" + common_good_rand(4), + // 16 bits for "time_mid" + common_good_rand(2), + // 16 bits for "time_hi_and_version", + // four most significant bits holds version number 4 + (hexdec(common_good_rand(2)) & 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 + (hexdec(common_good_rand(2)) & 0x3fff) | 0x8000, + // 48 bits for "node" + common_good_rand(6)); + } +} diff --git a/tests/UUIDTest.php b/tests/UUIDTest.php new file mode 100644 index 0000000000..de256ffa1f --- /dev/null +++ b/tests/UUIDTest.php @@ -0,0 +1,25 @@ +assertRegExp('/^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$/', + $result); + // Check version number + $this->assertEquals(0x4000, hexdec(substr($result, 14, 4)) & 0xF000); + $this->assertEquals(0x8000, hexdec(substr($result, 19, 4)) & 0xC000); + } +} +