隨機產生固定的位元(比如8位)的數字,
作為使用者註冊的uid存入資料庫,
每個uid不重複,
但可以是12345678,12345677。
有種方法是隨機產生8位元字,
然後查詢資料庫有無此資料,
有則重建在查詢,
無則寫入資料庫,
這樣的方式比較費時。
有沒有更好的方法,
比如結合別的隨機值、時間戳記之類的。
求解題思路或者方法,可用php實現
回複內容:
隨機產生固定的位元(比如8位)的數字,
作為使用者註冊的uid存入資料庫,
每個uid不重複,
但可以是12345678,12345677。
有種方法是隨機產生8位元字,
然後查詢資料庫有無此資料,
有則重建在查詢,
無則寫入資料庫,
這樣的方式比較費時。
有沒有更好的方法,
比如結合別的隨機值、時間戳記之類的。
求解題思路或者方法,可用php實現
通常資料庫中儲存的就是時間戳記,也就是當前系統時間的毫秒數,然後除以1000,擷取目前時間的秒數做為uid即可,因為如要儲存的是毫秒的話,它佔用資料庫太長,用秒數即可保證唯一不重複。如果想讓產生uid不只是數字還要有字母的話,可以將秒數轉成16進位即可。
使用者註冊的uid,在某個範圍自增就可以吧。
假設使用者註冊的qps沒有那麼高,可以利用update+私人複雜資料的方法在mongodb類比一個鎖,鎖保護“上次註冊的使用者的uid”資料,每次拿鎖,加一,註冊,將鎖保護的uid+1,釋放鎖即可。
唯一,非順序:md5(uniqid());
順序唯一:自增
使用時間戳,重複的幾率幾乎沒有。
//產生0到1的隨機小數public function randomFloat($min = 0, $max = 1) { return $min + mt_rand() / mt_getrandmax() * ($max - $min);}
為什麼怎麼搞?不用主鍵自增?
uid最好還是用主鍵自增吧,然後php這邊用mysql_insert_id()之類的函數取。這樣查詢操作也比較少。
建立一個自增列,起始值從10000000開始就行了。
很高興為LZ解答這個問題。
首先,有什麼東西是不停遞增,並且不會重複的?
時間。
正如LZ猜想的那樣,使用時間截轉化成數字,可以產生始終遞增並且不會重複的數字。
並且,這些數字還可以根據時間的推移,看大小就知道註冊先後和註冊時間。
這裡僅僅是拋磚引玉。
$now=date("Y-m-d H:i:s");//按照 年月日,時分秒的格式,記錄目前時間。$unix_stamp=strtotime($now);echo $unix_stamp;/*strtotime函數預期一個包含美國英語日期格式的字串,並嘗試將其解析為 Unix 時間戳記(自 January 1 1970 00:00:00 GMT 起的秒數)這裡LZ大概會得到一個10位的數字。*/
LZ可以把$unix_stamp作為隨機uid,如果認為秒數產生的數值不夠隨機的話
(比如1秒內有多人同時註冊),可以在$unix_stamp後加上microtime()函數轉換成數字
來使得這個數字更加隨機,以避免uid重複的問題。