The following class generates VALID RFC 4211 COMPLIANT Universally Unique IDentifiers (UUID) version 3, 4 and 5.
Version 3 and 5 UUIDs are named based. They require a namespace (another valid UUID) and a value (the name). Given the same namespace and name, the output is always the same.
Version 4 UUIDs are pseudo-random.
UUIDs generated below validates using OSSP UUID Tool, and output for named-based UUIDs are exactly the same. This is a pure PHP implementation.
public static functionv3($namespace,$name) {
if(!self::is_valid($namespace)) returnfalse;// Get hexadecimal components of namespace$nhex=str_replace(array('-','{','}'),'',$namespace);// Binary Value$nstr='';// Convert Namespace UUID to bitsfor($i=0;$i
}// Calculate hash value$hash=md5($nstr.$name);
returnsprintf('%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 functionv4() {
returnsprintf('%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 4mt_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.1mt_rand(0,0x3fff) |0x8000,// 48 bits for "node"mt_rand(0,0xffff),mt_rand(0,0xffff),mt_rand(0,0xffff)
);
}
public static functionv5($namespace,$name) {
if(!self::is_valid($namespace)) returnfalse;// Get hexadecimal components of namespace$nhex=str_replace(array('-','{','}'),'',$namespace);// Binary Value$nstr='';// Convert Namespace UUID to bitsfor($i=0;$i
}// Calculate hash value$hash=sha1($nstr.$name);
returnsprintf('%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 functionis_valid($uuid) {
returnpreg_match('/^\{?[0-9a-f]{8}\-?[0-9a-f]{4}\-?[0-9a-f]{4}\-?'.'[0-9a-f]{4}\-?[0-9a-f]{12}\}?$/i',$uuid) ===1;
}
}// Usage
// Named-based UUID.$v3uuid=UUID::v3('1546058f-5a25-4334-85ae-e68f2a44bbaf','SomeRandomString');$v5uuid=UUID::v5('1546058f-5a25-4334-85ae-e68f2a44bbaf','SomeRandomString');// Pseudo-random UUID$v4uuid=UUID::v4();?>