PHP 现有的用于生成 v4 UUID 的函数在确保遵守 v4 标准的特定格式方面存在缺陷。标准规定第 9 个八位字节的高位和保留位应为 10。
罪魁祸首是函数对这些位的处理不一致。要纠正它,需要根据 RFC 4122 第 4.4 节进行具体修改。
下面的精炼函数实现了必要的调整:
function uuidv4() { $data = random_bytes(16); $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100 $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10 return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); }
数据使用random_bytes生成,保证随机性和安全性。随后的十六进制转换利用 vsprintf 来保持正确的格式。
对于 7.0 之前的 PHP 版本,其中 random_bytes 不可用,提供了替代实现:
$data = openssl_random_pseudo_bytes(16, $strong); // ensure the result is cryptographically strong assert($data !== false && $strong);
使用强加密非常重要随机数据生成器(例如 random_bytes 或 openssl_random_pseudo_bytes)可保证 UUID 的稳健性。如果您有特定要求,请考虑探索生成随机数据的替代方法。
以上是如何在 PHP 中生成有效的 V4 UUID?的详细内容。更多信息请关注PHP中文网其他相关文章!