怎樣生成唯一的ID

2021-08-26 14:42:52 字數 1644 閱讀 7008

作為乙個web開發者應該知道這裡的users後面的那串"066ab87a062b"必定是我的id,這個id肯定是唯一的。這就是今天要討論的,怎樣生成唯一的id?

如果你是乙個初級的web開發者,那麼你可能不會去生成這種唯一的id,因為有乙個很簡單的方法已經幫我們搞定了這個事情,那就是資料庫。

這個時候我們就得想乙個比較複雜的生成唯一id的想法。

一般來說,我們都會想到用當前系統時間來做這件事情,比如最簡單的是unix時間戳,像這樣

time();

//1429874998

一般情況下這樣是行不通的,因為unix時間戳只是精確到秒,同一秒有兩個人註冊怎麼辦?

我記得我一開始實習那會用這個方法來生成唯一id

time() . rand(1, 10000);

//142987499812

時間戳後面加乙個隨機數,這樣把一秒鐘分成10000份,重複的概率只有萬分之一,對於一般的情況已經能夠搞定了。

但是精明一點的人肯能會猜到你是在用10位的時間戳加乙個隨機數字,那怎麼辦?

第一反映自然是加密:

md5(time() . rand(1, 10000));

//141464d2619764441d30a285ed4478f5

不可逆的加密演算法有很多,比如md5,sha1等,當然如果使用可逆的加密演算法容易被看出來。這樣加密一般很難破解了,如果你還覺得不夠安全,可以在加密前後進行一系列字串操作,比如反轉。這樣就非常難以破解了。當然也有問題,那就是id變得很長很長。而且似乎也沒有解決生成唯一id的關鍵問題。

生成唯一id的關鍵問題就是唯一,安全問題次之,不是說安全不重要,而是如果連生成唯一id都解決不了,安全就沒有什麼可談的了,系統本身就是不穩定不安全的。

上述的方法還是有一定的概率生成重複id的,雖然只有萬分之一,但如果剛好兩個人在同一秒註冊,剛好就生成了一樣的呢?

php提供了乙個生成唯一id的函式:

uniqid();

//553a2f5bad51f

但是這個函式也不一定會生成唯一的id,原因是uniqid() 函式基於以微秒計的當前時間,生成乙個唯一的 id;基於微妙的意思就是如果併發數非常非常高的時候,在同乙個毫秒裡面有兩個人註冊,那麼也是會生成唯一的id。

正真做到不重複要怎麼辦?

一種方法是結合時間和資料庫生成的id,這兩者結合起來就是唯一的了。

至於怎麼結合可以根據自己的需求或者喜好。這樣生成的id只要不進行不可逆加密還可以按時間來排序。

還有一種方法是不借助資料庫那個唯一id,而是將註冊流程改為嚴格的單執行緒,也就是每次只處理乙個,那這樣時間戳就是唯一的了,生成方法也就可以隨意發揮了。當然了,一兩秒的等待使用者還是可以接受的。

怎麼做到嚴格的單執行緒處理註冊流程?

第一種簡單的就是假設你已經控制好了系統是單執行緒處理的,我記得以前聽過乙個鴕鳥演算法,像鴕鳥一樣將頭埋在沙子裡面,什麼也不做,假裝看不到,有時候這何嘗不是一種好的生活態度呢。ok,繼續說,假設以微妙為單位,這對於90%的系統已經能滿足了,因為**的量根本沒有那麼大。

第二種方法是用佇列來處理,雖然牛刀殺雞,但也算是個方法。

php 生成唯一ID

function guid factor prefix suffix 生成因子 機器毫秒,使用者瀏覽器與作業系統資訊,使用者ip,隨機因子,及自定義 factor 因子 原理 自定義 factor 因子 例如可使用使用者 user id 模組標識 product,order.字首 prefix 可用...

php生成唯一id

網上查了下,有很多的方法 1 md5 time mt rand 1,1000000 這種方法有一定的概率會出現重複 2 php內建函式uniqid uniqid 函式基於以微秒計的當前時間,生成乙個唯一的 id.w3school參考手冊有一句話 由於基於系統時間,通過該函式生成的 id 不是最佳的。...

MySql唯一ID生成

前陣子,一直在折騰阿里雲。寫的一些文章也放到自己的wordpress部落格上了。但自己前陣子在做系統更換操作的時候未備份磁碟,大部分心血付諸東流。真是乙個悲傷的故事。現在決定用.net搞搞自己的部落格。正好把wordpress給拋棄掉。言歸正傳,這個唯一號類似自增id,自增id雖然好用,但進行資料庫...