在PHP的開發中,經常需要為某些變數生成唯一標識符,這時候可以使用PHP內置函數 uniqid()。本文將詳細介紹 uniqid() 的用法及其注意事項。
一、uniqid函數簡介
PHP中的uniqid() 函數用於生成一個唯一的ID,一般用於為某個變數或者文件命名(主要使用在上傳文件、框架開發、緩存系統等場景)。這個id可以是一個更好的資料庫主鍵,或是可以幫助您檢查一些錯誤。
二、uniqid函數的用法
uniqid() 函數的語法如下:
string uniqid ([ string $prefix = "" [, bool $more_entropy = FALSE ]] )
prefix為可選參數,用來指定生成的唯一ID前綴。如果想要前綴可用用microtime()more_entropy為可選參數,如果設置為 TRUE,將會生成一個加強的唯一ID
下面是一些使用示例:
1. 生成簡單的唯一ID
$unique_id = uniqid(); echo $unique_id;
這個代碼將會輸出類似 5d35ccdfe11e2 的唯一ID。默認情況下,uniqid() 函數不會生成加強的唯一 ID。生成的唯一ID包含兩部分:當前時間戳和微秒級別的隨機數。兩部分中間用 ‘.’ 連接。
2. 在 prefix 參數中設置前綴
$unique_id = uniqid('example');
echo $unique_id;
前綴不同於唯一ID的生成,它只是添加到生成的唯一 ID 前面。這個代碼將會輸出類似example5d35ccdfe11e2 的帶前綴的唯一ID。
3. 使用 microtime() 函數添加額外的 entropy
$unique_id = uniqid('', true);
echo $unique_id;
如果將more_entropy(第二個參數)設置為true,將會添加額外的隨機數據。代碼將會輸出類似 5d35d07eeddbd2.84371161 這樣的 ID,其中後面的那個數是經過額外加強的唯一ID。
三、隨機數的生成方式
在PHP中,uniqid() 函數以當前時間為種子來生成一段隨機數。這個隨機數有兩種不同的方式生成。
1. 使用 gettimeofday() 函數
在 Linux和Unix 系統下,PHP將使用 gettimeofday() 函數來獲取當前時間。這個函數返回一個包含當前時間和微妙數的數組,在這個數組中,第一項是 當前 Unix 時間戳,第二項是 微秒數。
將這些數值格式化為唯一ID:
/**
* 獲取隨機數並格式化
* @return string
*/
function formatUniqId() {
$timeArr = gettimeofday();
$id = sprintf('%08x%05x%04x%03x', $timeArr['sec'], ($timeArr['usec'] / 10), getmypid(), \rand(0, 999));
return $id;
}
2. 使用 Windows API 函數生成隨機數
在 Window 系統下,PHP使用 Windows API 函數 GetTickCount() 獲取系統時間。這個函數返回從系統啟動開始計算的微秒數,但是每 49.7 天會發生一次迴繞(overflow),並且會直接影響你的唯一 ID 的生成方式。有人甚至會藉此來計算 Windows 工作時間。
下面是一個Windows平台下使用的唯一ID生成代碼:
/**
* 獲取隨機數並格式化
* @return string
*/
function formatUniqId() {
static $incr = 0;
$time = explode(' ', microtime());
$id = substr($time[1], 2) . str_pad(substr($time[0], 2, 6) . (++$incr % 1000000), 6, '0', STR_PAD_LEFT);
return $id;
}
四、注意事項
儘管 uniqid() 函數可以為我們生成唯一ID,但是我們也需要注意到一些問題:
uniqid()僅僅只是生成唯一 ID 的工具,我們還需要根據自己的業務場景來決定是否需要更多完善的處理- 在一種情況下,生成的唯一ID會發生重複現象:當多個請求同時調用 uniqid() 函數時,由於其使用時間作為參數,可能會在同一時刻生成相同的ID
- 當
more_entropy參數設置為true時,還需要注意多進程並發下的並發問題 - 由於uniqid() 的唯一性是基於當前時間的,所以必須儘可能的使用NTP同步伺服器時間,否則可能會出現時間誤差
總結
uniqid() 函數是PHP中用於生成唯一ID的一個內置函數,具有很好的應用價值。在實際開發中,我們需要結合自己的業務場景和需要生成的唯一ID進行相關的優化和改造。同時我們也需要儘可能地避免一些並發和時間同步等問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/158158.html
微信掃一掃
支付寶掃一掃