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中文網其他相關文章!