Aşağıdaki class'ı kullanarak RFC 4211'e uygun bir Universally Unique IDentifier (UUID) veya GUID karakter dizisi yaratabilirsiniz. Veritabanındaki kayıtlar için otomatik olarak yaratılan numaraların yerine kullanabilirsiniz. Bu örneği UUID adresinden aldım yani bana ait değil. Ne olur ne olmaz, bir gün kaybolabilir.


Class


class UUID
{
const COMMON_NAMESPACE = '64566f3d-9c52-4589-b7d9-82d1a22e18a3';

public static function v3($namespace, $name)
{
if (!self::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 static function v4()
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 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 static function v5($namespace, $name)
{
if (!self::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 static 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;
}
}

Kullanımı


// name-based and hashed with MD5
echo $v3uuid = UUID::v3('1546058f-5a25-4334-85ae-e68f2a44bbaf', 'SomeRandomString');
echo $v3uuid = UUID::v3(UUID::COMMON_NAMESPACE, 'SomeRandomString');
echo $v3uuid = UUID::v3(UUID::COMMON_NAMESPACE, 'SomeRandomString');

// name-based and hashed with SHA1
echo $v5uuid = UUID::v5('1546058f-5a25-4334-85ae-e68f2a44bbaf', 'SomeRandomString');
echo $v5uuid = UUID::v5(UUID::COMMON_NAMESPACE, 'SomeRandomString');
echo $v5uuid = UUID::v5(UUID::COMMON_NAMESPACE, 'SomeRandomString');

// Always random
echo $v4uuid = UUID::v4();

Sonuç


643dc989-58e9-3e72-9fd5-e3b4a09b62e9
cbf4f776-76b4-354f-b58b-4e6f40531181
cbf4f776-76b4-354f-b58b-4e6f40531181

c8333619-8220-5b21-b5d9-2bd56713675a
8b731897-178b-5abb-be50-ebb69f9d848c
8b731897-178b-5abb-be50-ebb69f9d848c

e8268b3e-449c-4e49-87ff-82db2da75715