短ID在實際運用中很廣泛, 其中比較典型的運用就是短地址。 市面上肯定有不少開源的生成短ID庫, 基於node.js的估計也不少。 鑒於本人已然是node.js的腦殘粉(本職java開發), 很多業余項目從前端到后端都基於javascript開發, 加上npm和bower的包管理以及grunt的打包工具, 在項目開發過程中體驗特別酸爽。 由於當時項目前后端都會用到短ID, 但沒找到合適的庫同時支持npm和bower的(可能孤陋寡聞). 因此自己樂此不疲地又造了個輪子js-shortid(夷,為什么會說
又
呢?!). 下面主要介紹它的實現方案, 自認為比較優雅簡潔。
js-shortid
js-shortid是一個基本於node.js的開源短ID的產生器, 其生成的短ID滿足無序、不可預測、URL地址友好以及足夠短且據有唯一的基本特征。下面就是由它產生的實例,先感受一下:
R6zw8Hly
R6AhD4Jw
R6Cip4M3
R6Ej09A1
R6Fjw3Q4
R6FP04jv
R6IlvZRb
R6LCSXn8
R6NT1Syx
R6O8RN67
方案
js-shortid的實現方案很清淅且簡單,它由兩個字符串夠成——時間序號和鹽
(多個隨機數).
所謂時間序號,就是一個從某個時間點開始按照一定時間間隔有序遞增的數字,並用62進制表示。 js-shortid默認的起始時間是2016-04-11 8:00以毫秒為間隔遞增,即每一毫秒加1。當然,你可以根據實際需要設置起始時間和遞增間隔,如以秒,分,時為間隔進行遞增,間隔越大遞增就越慢,即ID的時間序號部分變長也會越慢,但同一時間間隔生產的序號是一樣的。在高並發或集群中,即便是1毫秒的時間間隔,其序號也是大有可能是一樣的。 所以就有了另一部份鹽
。
所謂鹽
,其實是借用了安全領域的術語加鹽
, 其一般會用於對加密后的密碼(如MD5)加鹽
, 使其不可預測。 而這里也是使產生的短ID不可預測, 由多個隨機數組成的字符串,每個隨機數以62進制表示, 占兩個字符。 加多少鹽
取決於你的設置, 默認為2, 即兩個鹽,占四個字符。 所以,加的鹽
越多, 越難預測,同時使短ID更加接近於UUID(全局唯一性ID), 但ID就越長了。
一般來說, 如果時間序號以毫秒遞增並加4個鹽
,幾乎已然就是UUID了。畢竟一毫秒之內隨機產生的4個鹽
出現一模一樣的幾乎是不可能的了。
使用
- node.js
var shortid=require('shortid');
console.log(shortid.gen());
- 瀏覽器
var sid = shortid.gen();
console.log(sid);
更多點贊,代碼,詳情請移步Github
最后
重要的東西放在最后(廣告)。
-
OK的話,幫加個加星,加星又不會懷孕:github.com/zzzhan/js-shortid
-
本文使用Markdown Notes進行編輯,推薦大家使用,大家使用,使用,用:md.shapefly.com