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