在網(wǎng)上看了很多人用 js 隨機數(shù)和時間戳生成 id 的方法,我驗證過并不可靠,重復(fù)的幾率很大狮惜,所以手寫了下面的函數(shù),這個函數(shù)生成的id是不會重復(fù)的碌识,因為已經(jīng)做了重復(fù)判斷碾篡。
console.log(Date.now());
function createUniqueId(n) {
var random = function() { // 生成10-12位不等的字符串
return Number(Math.random().toString().substr(2)).toString(36); // 轉(zhuǎn)換成十六進(jìn)制
}
var arr = [];
function createId() {
var num = random();
var _bool = false;
arr.forEach(v => {
if(v === num) _bool = true;
});
if(_bool) {
createId();
}else {
arr.push(num);
}
}
var i = 0;
while(i < n) {
createId();
i++;
}
return arr;
}
console.log(Date.now());
// 關(guān)于random函數(shù),還有其它版本
// 版本一:
var random = function() { // 生成10-12位不等的字符串
return Math.random().toString(36).slice(2); // 截取小數(shù)點后的字符串
}
// 版本二:
var random = function(n) { // 生成6位長度的字符串
return ((Math.random() * (1 << 30))).toString(36); // "<<"操作相當(dāng)于乘上2的n次方筏餐,""相當(dāng)于parseInt
}
// 版本三:
var random = function(n) { // 生成n位長度的字符串
if(n === 1) return ((Math.random() * 36)).toString(36);(Math.random() * 36)).toString(36) + random(n-1); // 遞歸在性能上不怎么理想开泽,不推薦
return (
}
// 或
var random = function(n) { // 生成n位長度的字符串
return function(n, s) {
if(n === 1) return s;
return random(n -1, ((Math.random() * 36)).toString(36) + s);(Math.random() * 36)).toString(36));
}(n, (
}
// 版本四:
var random = function(n) { // 生成n位長度的字符串
var str = "abcdefghijklmnopqrstuvwxyz0123456789"; // 可以作為常量放到random外面
var result = "";
for(var i = 0; i < n; i++) {
result += str[parseInt(Math.random() * str.length)];
}
return result;
}
對于前端來說,做數(shù)據(jù)可視化的時候往往需要唯一的 id 來標(biāo)識數(shù)據(jù)魁瞪。
但是這個函數(shù)不適合于后端穆律,因為后端數(shù)據(jù)庫往往會存儲億級的數(shù)據(jù)量,這時候可以考慮md5之類的方案导俘,例如pgsql把正整數(shù)作id也不錯众旗。