2009-09-08 22 views
2

我使用的是考慮這個:http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.html在PHP中生成真正獨特的訂單ID?

我的想法是使用2和3之間的混合,但我的問題是,雖然可能性很小,是還有一個機會,兩個命令具有相同的順序如果我將結果子字符串長度僅爲5個字符,可以生成#個字符嗎? 3呢? 2? 1?當然,如果它是1,那麼id有可能是1 /(26 + 10)。

+0

在發佈鏈接的第一個代碼示例已經是廢話:他忘了在他的字符串認沽報價(我不認爲這是一個常數) – knittl 2009-09-08 09:33:40

回答

4

假設你的用戶的產生,有一個用戶ID:

$unique_id = time() . mt_rand() . $userid; 

如果同一用戶在同一秒內第二次請求此頁面,則mt_getrandmax()中的機會仍然爲1,並且在我的機器上返回2147483647.您也許可以忍受這種情況?

如果您的用戶未通過身份驗證,您可以根據自己的IP地址使用散列。

4

爲什麼你需要一個唯一的ID?

如果您想在您的數據庫中生成一個唯一的ID,請使用自動增量將其保留到您的數據庫中。

無論如何,你可以使用microtime()和rand()的組合。你很獨特。

編輯,相對於OP的評論:

你不能有一個 「始終是唯一的」 如果。或者如果你發現如何,你會贏得圖靈獎。

更好的數學方法讓你嚐到了「是的,但一旦在15645736536475次,我會搞砸」。

唯一的辦法是有計數器,每增加一次你就需要一個新的ID。這就是數據庫的作用。爲什麼在插入前需要ID?

+0

我想唯一的ID在我提交到數據庫。我同意,這將是「非常獨特」。我怎樣才能獲得一個獨一無二的,而不需要將其存儲在數據庫中的。 – coderama 2009-09-08 09:33:26

+0

你認爲這有可能嗎?要生成「始終唯一的ID」,您不僅必須知道之前生成的所有ID,還需要生成任何ID。請花點時間瞭解如何做到這一點...... – fresskoma 2009-09-08 10:04:37

+2

@ x3ro :這有些誇張......如果您認爲算法本身沒有改變,那麼您可以通過了解*所有過去的ID *或*所有將來的ID來保證唯一的ID。而用我們目前的技術,前者更容易實施! – 2009-09-08 10:09:19

1

從PHP的uniqid的手冊頁採取:

$better_token = md5(uniqid(mt_rand(), true)); 

雖然它可能會更好離開md5 -part出來,如果你的使用(減少令牌2^128號)

數據庫,那麼,你應該讓你的DBMS處理被認證的ID的

3

如果你依賴於一個隨機字符串,那麼是的,理論上兩個ID可能是相同的。這就是爲什麼使用一個很長的隨機字符串,使這種可能性不可能被接受。可以計算概率:例如,如果一個ID由當前時間(到最近的秒)和一個隨機的5個字符的字母數字字符串組成,並且假設3個ID在同一秒內生成,則兩個(38^5!/(38^5-3)!/ 38^5^3)= 3.79e-8。大多數人會同意這樣的機率是而不是足夠低的實際應用程序,這就是爲什麼您鏈接到的頁面建議10個字符,而不是。

如果您有會話ID,用戶名等,那麼您可以在訂單ID中使用該ID來幫助解決問題。

+0

我同意數學方法。 IMO 1E-15 **開始**是可以接受的。 – 2009-09-08 10:50:35

1

您可以使用microtime和sha256散列,或不使用散列。

$generate_order_id = hash('sha256', microtime());