2011-11-27 75 views
1

我總是無法確定這是什麼時候生成唯一的數字在PHP中。唯一性:`時間()`Vs`mt_rand()`

time()mt_rand()更獨特嗎?

time()對我來說似乎更獨特,因爲時間日期不能重複兩次。

mt_rand()我不確定PHP的默認唯一整數提供 - 將一個獨特的整數在時間上重複嗎?

+2

這個選擇還取決於你想要使用這些數字的目的... – deceze

+0

只需要像'AUTO_INCREMENT'那樣使用它,你可以在MySQL中創建一個頁面或產品ID。我不能使用'AUTO_INCREMENT'作爲ID唯一性,因爲我有兩個表共享相同的信息。 – laukok

+1

你不能在其中一個表上使用'AUTO_INCREMENT',並使用生成的id作爲另一個表嗎? 'mysql_insert_id'可以提供幫助。 – poke

回答

2

您考慮過uniqid()嗎?

另外,要回答你的實際問題:mt_rand肯定會最終重複一個數字,不像time()。但是,如果您希望它是唯一的,則每秒只能使用time()

+0

是的,但一個uniqid,如:4b3403665fea6包含字母......我只是想要整數。謝謝。 – laukok

+0

那麼,你可以使用'base_convert'如:'base_convert(uniqid(),16,10)'這將使它成爲一個唯一的int –

+0

哦,我想補充說的是,整數非常高。如果你使用的是32位系統,你可能希望'substr()'離開'uniqid()'的前2個字節。 –

2

如果您有很多用戶一次性使用time(),您可能會在同一秒內發生兩個事件,從而使time()不像mt_rand()那樣唯一。使用mt_rand(),你是幾乎保證獲得獨特的結果,但你可能不會。

另一種解決方案是使用microtime()返回以微秒爲當前時間,這將給你獨一無二的郵票,因爲這將是不平凡的在同一微秒發生的事件。你也可以很可能使用microtime()內部使用的時間(考慮uniqid()從以微秒當前時間(生成一個ID

1

)通常不是唯一的ID是個好主意,有幾個原因:

  1. 不同的操作系統可以有不同的時間分辨率,所以你可能會得到連續的ID 2完全相同
  2. 它可能沒有關係,但它是相當容易的猜測,是基於時間
+0

即使所有'隨機'數字都是基於當前時間。這就是爲什麼隨機性不存在,所有的隨機性實際上是僞隨機性。但是非常真實! +1 – Rudie

+0

並非所有的隨機發生器都是基於時間的(儘管大多數都是),有些是基於溫度的,在極少數情況下是量子隧道效應。但更重要的是,它們在數學上更難以相互推斷,這是實際的一點。 – idanzalz

+0

溫度=)Kewl!不知道。 – Rudie

2

mt_標識rand可以生成兩次相同的值,但您可以考慮這種情況的概率,其中時間返回自unix時期以來的秒數,不能重複兩次。但它每秒都會改變,這意味着如果一秒鐘內調用超過一次,它將返回相同的結果,其中mt_rand可能會返回不同的值。