唯一ID
2024年01月14日
一、UUId
1.1 Math.random() * 16 | 0
function getUniqueIdByUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
/[xy]/g,
function (c) {
var r = (Math.random() * 16) | 0,
v = c == 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
}
);
}
function getUniqueId() {
return getUniqueIdByUUID();
}
1.2 Math.floor(Math.random() * 0x10)
function getUniqueIdByUUID() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
function getUniqueId() {
return getUniqueIdByUUID();
}
1.3 1 + Math.random()) * 0x10000) | 0
function getUniqueIdByUUID() {
const s = [];
const hexDigits = '0123456789abcdef';
for (let i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = '4'; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = '-';
const uuid = s.join('');
return uuid;
}
function getUniqueId() {
return getUniqueIdByUUID();
}
1.4 Math.random().toString(36).slice(2)
function getUniqueIdByUUID() {
return Math.random().toString(36).slice(2);
}
function getUniqueId() {
return getUniqueIdByUUID();
}
二、NanoID
2.1 Math.random() * 64
function getUniqueIdByNanoID(size = 10) {
let id = '';
let i = size;
const urlAlphabet =
'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
while (i--) {
id += urlAlphabet[(Math.random() * 64) | 0];
}
return id;
}
function getUniqueId(size) {
return getUniqueIdByNanoID(size);
}
三、随机生成器对比
uuid
: 使用不安全的 Math.random()
NanoID
: 使用 crypto module
和 Web Crypto API
,意味着 NanoID
更安全。 此外,NanoID
在 ID
生成器的实现过程中使用了自己的算法,称为统一算法,而不是使用随机 %
字母表 random
%
alphabet
, 它既快速又紧凑 NanoID
比 UUID
快 60%
。与 UUID
字母表中的 36
个字符不同,NanoID
只有 21
个字符。