在PHP編程中,我們有時候在高并發的時候生成很多個不同的ID,用于標識一些東西。雖然有很多方法,可以實現這一過程,不過PHP還是給我們提供了一個很好的函數,用于生成不同的唯一的ID

PHP中的uniqid()函數

函數定義

国产视频appuniqid() 函數基于以微秒計的當前時間,生成一個唯一的 ID。

語法

uniqid(prefix,more_entropy)

注釋:

prefix可選。為 ID 規定前綴。如果兩個腳本恰好在相同的微秒生成 ID,該參數很有用。

more_entropy 可選。規定位于返回值末尾的更多的熵。

舉例說明

利用uniqid()生成一個ID

代碼

<?php
//飛鳥慕魚博客
    echo '輸出一個唯一的ID標示符:'.uniqid();
?>

代碼示意圖

PHP中的uniqid()函數,生成唯一的ID

運行結果:

輸出一個唯一的ID標示符:5b5157b059eab

利用for循環與uniqid()函數,連續生成10個不同的ID標識

代碼

<?php
//飛鳥慕魚博客
for($i=1;$i<11;$i++){
    echo '輸出第'.$i.'個標示符:'.uniqid().'<br/>';
}
?>

代碼示意圖

PHP中的uniqid()函數,生成唯一的ID


代碼運行結果

輸出第1個標示符:5b5159143085f
輸出第2個標示符:5b51591430886
輸出第3個標示符:5b515914308c5
輸出第4個標示符:5b51591430905
輸出第5個標示符:5b51591430944
輸出第6個標示符:5b51591430981
輸出第7個標示符:5b515914309bf
輸出第8個標示符:5b515914309fc
輸出第9個標示符:5b51591430a3a
輸出第10個標示符:5b51591430a77

對于uniqid()函數補充

国产视频app如果我們單純使用 uniqid() 這個方法,不帶任何參數的話,這個方法只能保證單個進程,在同一個毫秒內是唯一的。如果使用uniqid("", true)。 帶了一個墑值,自身已經有一個隨機的方式能保證生成的id的隨機性了。但是由于線性同余是比較簡單的生成隨機數的算法,隨機性有可能還不夠,所以,網上流傳的一種更隨機數值的方式是:

uniqid(mt_rand(), true)

其中 mt_rand() 生成隨機數就不是使用線性同余生成隨機數的方式了,而是使用 Mersenne Twister Random Number Generator (梅森旋轉算法)。換句話說,上面這個 id 由兩種隨機算法 + 時間戳生成。基本上,這個算法在很大程度上能保證唯一性了(如果要問沖突率的話,估計只有數學系學生能研究出來了...)。

上面的這個給出的id會有一個點號,而且長度并不是128bit。如果希望生成uuid,就需要一個hash,不管是md5,sha1 都是可以選擇的。所以網上又有一種生成唯一碼的方式。

md5(uniqid(mt_rand(), true))

但是,本質上,這兩種方式的隨機性是相等的。