鍍金池/ 問答/PHP  數(shù)據(jù)庫/ while 中處理訂單,如何產(chǎn)生不重複的數(shù)字?

while 中處理訂單,如何產(chǎn)生不重複的數(shù)字?

while ($row = mysqli_fetch_array($aa)){

      $public_order_id = date('Ymd', time()).rand(1,999999);

因?yàn)樵谝凰查g會產(chǎn)生不止一筆
我目前很白癡的做法是用 rand.....
但是1,999999 還是有機(jī)率重複,因?yàn)槭怯?while 產(chǎn)生訂單!
所以搞不好第一筆是產(chǎn)生222,第二十筆也會有 222 的機(jī)率!
因?yàn)槭褂?time() 沒有用,時(shí)間會完全一模一樣,速度太快了
除非產(chǎn)生的訂單超過20筆,時(shí)間搓個(gè)位數(shù)可能才會+1
而且還要跟數(shù)據(jù)庫比對,如果有重複則回到上一步驟重新產(chǎn)生?
我有一個(gè)ID是給程式看的,所以用 AUTO_INCREMENT
但現(xiàn)在產(chǎn)生的是要給人看的
想問一下更好的方式???

回答
編輯回答
避風(fēng)港

1: uuid
2:使用更小的微秒

// 生成一萬個(gè)
for ($i = 0; $i < 10000; ++ $
    
    do {
        $time = str_replace('.', '', microtime(true));
        // 這樣子重復(fù)的概率已經(jīng)比較小了,如果還怕重復(fù),只能手動(dòng)篩選了
        $key = $time . str_pad(1, 9999, STR_PAD_LEFT);
        
        // 可以裝進(jìn)數(shù)組判斷,但注意內(nèi)存
        if (不存在) {
            // 存起來
            break;
        }
        
        // 不存在 繼續(xù)循環(huán)
    } while(true);
    
}
2018年1月18日 11:22
編輯回答
尐潴豬

我覺得你這個(gè)用date('Ymd').uniqid().rand(10000,99999)夠了

2018年1月15日 05:57
編輯回答
雨蝶

訂單編號可以拼上用戶標(biāo)識(user_id)和用戶訂單數(shù)。

2017年1月5日 16:45