在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