怎樣生成唯一的ID?

打開我的簡書首頁鬼吵,在地址欄上可以看到這樣的地址

http://www.reibang.com/users/066ab87a062b/latest_articles

作為一個web開發(fā)者應(yīng)該知道這里的users后面的那串"066ab87a062b"必定是我的ID,這個ID肯定是唯一的卵皂。這就是今天要討論的,怎樣生成唯一的ID?

如果你是一個初級的web開發(fā)者,那么你可能不會去生成這種唯一的ID,因為有一個很簡單的方法已經(jīng)幫我們搞定了這個事情戴质,那就是數(shù)據(jù)庫。

比如我們往數(shù)據(jù)庫的用戶表中插入一個用戶踢匣,數(shù)據(jù)庫的自增鍵就會生成一個唯一的ID告匠,當(dāng)然這種ID是很簡單的,就是從1開始自增离唬,這樣就不會重復(fù)后专。當(dāng)然這里有很大的安全隱患,從鏈接上多觀察一下输莺,就能發(fā)現(xiàn)規(guī)律戚哎。如果簡書現(xiàn)在的鏈接是這樣的:

http://www.reibang.com/users/19875/latest_articles

再多看看其他用戶的簡書首頁地址,你發(fā)現(xiàn)也是一個數(shù)字嫂用,并且修改幾個連續(xù)的數(shù)字大多數(shù)能查看到其他用戶型凳,那么現(xiàn)在我就可以從ID為1開始遍歷,就可以知道簡書有多少注冊用戶了嘱函。是不是算暴露了信息甘畅?當(dāng)然黑客可以做的事情遠(yuǎn)遠(yuǎn)不止這些。

這個時候我們就得想一個比較復(fù)雜的生成唯一ID的想法。

一般來說疏唾,我們都會想到用當(dāng)前系統(tǒng)時間來做這件事情蓄氧,比如最簡單的是unix時間戳,像這樣

time();
//1429874998

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

我記得我一開始實習(xí)那會用這個方法來生成唯一ID

time() . rand(1, 10000);
//142987499812

時間戳后面加一個隨機數(shù)顿天,這樣把一秒鐘分成10000份泄朴,重復(fù)的概率只有萬分之一,對于一般的情況已經(jīng)能夠搞定了露氮。

但是精明一點的人肯能會猜到你是在用10位的時間戳加一個隨機數(shù)字,那怎么辦钟沛?

第一反映自然是加密:

md5(time() . rand(1, 10000));
//141464D2619764441D30A285ED4478F5

不可逆的加密算法有很多畔规,比如md5,sha1等,當(dāng)然如果使用可逆的加密算法容易被看出來恨统。這樣加密一般很難破解了叁扫,如果你還覺得不夠安全,可以在加密前后進(jìn)行一系列字符串操作畜埋,比如反轉(zhuǎn)莫绣。這樣就非常難以破解了。當(dāng)然也有問題悠鞍,那就是ID變得很長很長对室。而且似乎也沒有解決生成唯一ID的關(guān)鍵問題。

生成唯一ID的關(guān)鍵問題就是唯一咖祭,安全問題次之掩宜,不是說安全不重要,而是如果連生成唯一ID都解決不了么翰,安全就沒有什么可談的了牺汤,系統(tǒng)本身就是不穩(wěn)定不安全的。

上述的方法還是有一定的概率生成重復(fù)ID的浩嫌,雖然只有萬分之一檐迟,但如果剛好兩個人在同一秒注冊,剛好就生成了一樣的呢码耐?

php提供了一個生成唯一ID的函數(shù):

uniqid();
//553a2f5bad51f

這個生成的ID就和簡書的ID非常像了追迟。

但是這個函數(shù)也不一定會生成唯一的ID,原因是uniqid() 函數(shù)基于以微秒計的當(dāng)前時間伐坏,生成一個唯一的 ID怔匣;基于微妙的意思就是如果并發(fā)數(shù)非常非常高的時候,在同一個毫秒里面有兩個人注冊,那么也是會生成唯一的ID每瞒。

正真做到不重復(fù)要怎么辦金闽?

一種方法是結(jié)合時間和數(shù)據(jù)庫生成的ID,這兩者結(jié)合起來就是唯一的了剿骨。
至于怎么結(jié)合可以根據(jù)自己的需求或者喜好代芜。這樣生成的ID只要不進(jìn)行不可逆加密還可以按時間來排序。

還有一種方法是不借助數(shù)據(jù)庫那個唯一ID浓利,而是將注冊流程改為嚴(yán)格的單線程挤庇,也就是每次只處理一個,那這樣時間戳就是唯一的了贷掖,生成方法也就可以隨意發(fā)揮了嫡秕。當(dāng)然了,一兩秒的等待用戶還是可以接受的苹威。

怎么做到嚴(yán)格的單線程處理注冊流程昆咽?

第一種簡單的就是假設(shè)你已經(jīng)控制好了系統(tǒng)是單線程處理的,我記得以前聽過一個鴕鳥算法牙甫,像鴕鳥一樣將頭埋在沙子里面掷酗,什么也不做,假裝看不到窟哺,有時候這何嘗不是一種好的生活態(tài)度呢泻轰。ok,繼續(xù)說且轨,假設(shè)以微妙為單位浮声,這對于90%的系統(tǒng)已經(jīng)能滿足了,因為網(wǎng)站的量根本沒有那么大殖告。
第二種方法是用隊列來處理阿蝶,雖然牛刀殺雞,但也算是個方法黄绩。

講這么多大概講完了今天想到的東西羡洁,最近有點感觸就是,遇到的東西多思考你將可能發(fā)現(xiàn)更多的好玩的東西爽丹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筑煮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粤蝎,更是在濱河造成了極大的恐慌真仲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件初澎,死亡現(xiàn)場離奇詭異秸应,居然都是意外死亡虑凛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門软啼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桑谍,“玉大人,你說我怎么就攤上這事祸挪÷嗯” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵贿条,是天一觀的道長雹仿。 經(jīng)常有香客問我,道長整以,這世上最難降的妖魔是什么胧辽? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮公黑,結(jié)果婚禮上票顾,老公的妹妹穿的比我還像新娘。我一直安慰自己帆调,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布豆同。 她就那樣靜靜地躺著番刊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪影锈。 梳的紋絲不亂的頭發(fā)上芹务,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音鸭廷,去河邊找鬼枣抱。 笑死,一個胖子當(dāng)著我的面吹牛辆床,可吹牛的內(nèi)容都是我干的佳晶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讼载,長吁一口氣:“原來是場噩夢啊……” “哼轿秧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咨堤,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤菇篡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后一喘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱还,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了议蟆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷沥。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咪鲜,靈堂內(nèi)的尸體忽然破棺而出狐赡,到底是詐尸還是另有隱情,我是刑警寧澤疟丙,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布颖侄,位于F島的核電站,受9級特大地震影響享郊,放射性物質(zhì)發(fā)生泄漏览祖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一炊琉、第九天 我趴在偏房一處隱蔽的房頂上張望展蒂。 院中可真熱鬧,春花似錦苔咪、人聲如沸锰悼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箕般。三九已至,卻和暖如春舔清,著一層夾襖步出監(jiān)牢的瞬間丝里,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工体谒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杯聚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓抒痒,卻偏偏與公主長得像幌绍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子故响,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理纷捞,服務(wù)發(fā)現(xiàn),斷路器被去,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,075評論 25 707
  • 一抹殘涼閱讀 960評論 2 3
  • 人參在古代被稱為神草惨缆,能醫(yī)治的病癥涉及內(nèi)科糜值、外科丰捷、兒科、婦科寂汇、五官科等病往,同時大失血,大汗骄瓣,大吐瀉等一切疾病導(dǎo)致的元...
    銥甜閱讀 13,674評論 0 2
  • 她本是個怕吃藥打針的停巷,可自從他到了鎮(zhèn)上后,她便時常去他的診所榕栏,不是說自己發(fā)燒了畔勤,就是流鼻涕了,等等扒磁。 她總是有理由...
    li_xiu_閱讀 278評論 0 0