怎樣產生資料庫中不重複的固定位元的數字?

來源:互聯網
上載者:User
隨機產生固定的位元(比如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重複的問題。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.