可行计划
1. 生成 [0,1) 的随机数的 Math.random
// 我这次运行生成的是:0.5834165740043102
Math.random();
2. 获取以后工夫戳 Date.now
// 当初工夫戳是 1482645606622
Date.now();
3. 将 10 进制转换为其余进制的字符串 Number.toString
// 将 1482645606622 转换成二进制:10101100100110100100100001001000011011110
(1482645606622).toString(2);
// 转换成 16 进制:159349090de MongDB 中的 ObjectID 就是 24 位 16 进制数
(1482645606622).toString(16);
// 最大进制反对转为 36 进制,应用字符是 0 -9a-z:ix48wvry
(1482645606622).toString(36);
改良版本一:随机数 + toString()
1. 随机数版本
/**
* 生成一个用不反复的 ID
*/
function GenNonDuplicateID(){return Math.random().toString()}
// 生成一个相似 0.1283460319177394 的 ID
GenNonDuplicateID()
2. 随机数版本 16 进制版本
/**
* 生成一个用不反复的 ID
*/
function GenNonDuplicateID(){return Math.random().toString(16)
}
// 函数将生成相似 0.c1615913fa915 的 ID
GenNonDuplicateID()
3. 随机数版本 36 进制版本
/**
* 生成一个用不反复的 ID
*/
function GenNonDuplicateID(){return Math.random().toString(36)
}
// 函数将生成相似 0.hefy7uw6ddzwidkwcmxkzkt9 的 ID
GenNonDuplicateID()
4. 随机数版本 36 进制版本
/**
* 生成一个用不反复的 ID
*/
function GenNonDuplicateID(){return Math.random().toString(36).substr(2)
}
// 函数将生成相似 8dlv9vabygks2cbg1spds4i 的 ID
GenNonDuplicateID()
总结
劣势:应用 toString 的进制转化能够实现更短的字符串示意更多的范畴
毛病:用一个随机数作为 ID,随着应用次数的累积,必然会呈现雷同的两个 ID
改良版本二
1. 引入工夫戳 + 36 进制版本
/**
* 生成一个用不反复的 ID
*/
function GenNonDuplicateID(){let idStr = Date.now().toString(36)
idStr += Math.random().toString(36).substr(2)
return idStr
}
// 函数将生成相似 ix49sfsnt7514k5wpflyb5l2vtok9y66r 的 ID
GenNonDuplicateID()
2. 引入工夫戳 + 36 进制版本 + 随机数长度管制
/**
* 生成一个用不反复的 ID
*/
function GenNonDuplicateID(randomLength){let idStr = Date.now().toString(36)
idStr += Math.random().toString(36).substr(2,randomLength)
return idStr
}
// GenNonDuplicateID(3) 将生成相似 ix49wl2978w 的 ID
GenNonDuplicateID(3)
然而,这样生成的 ID 后面几位总是雷同。
3. 引入工夫戳 + 随机数前置 36 进制 + 随机数长度管制
/**
* 生成一个用不反复的 ID
*/
function GenNonDuplicateID(randomLength){return Number(Math.random().toString().substr(2,randomLength) + Date.now()).toString(36)
}
//GenNonDuplicateID()将生成 rfmipbs8ag0kgkcogc 相似的 ID
GenNonDuplicateID()
总结
只应用工夫戳,有个能在同一时间多人拜访生成的是一样的。加上随机数能够实现惟一。再加上自定义长度,使 UUID 更灵便。
总结
万能计划:
/**
* 生成一个用不反复的 ID
* @param {Number} randomLength
*/
function getUuiD(randomLength){return Number(Math.random().toString().substr(2,randomLength) + Date.now()).toString(36)
}