優(yōu)雅簡潔地實(shí)現(xiàn)短ID

優(yōu)雅簡潔

短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

最后

重要的東西放在最后。

  1. OK的話,幫加個(gè)加星,加星又不會(huì)懷孕:github.com/zzzhan/js-shortid

  2. 本文使用自己開發(fā)的Markdown Notes進(jìn)行編輯,推薦大家使用,大家使用,使用,用:md.shapefly.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,166評(píng)論 6 13
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,524評(píng)論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,948評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評(píng)論 18 399
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)、高可擴(kuò)展、高可用、大數(shù)據(jù)存儲(chǔ)問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,354評(píng)論 0 36