跳到主要内容

唯一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 moduleWeb Crypto API,意味着 NanoID 更安全。 此外,NanoIDID 生成器的实现过程中使用了自己的算法,称为统一算法,而不是使用随机 % 字母表 random % alphabet, 它既快速又紧凑 NanoIDUUID60%。与 UUID 字母表中的 36 个字符不同,NanoID 只有 21 个字符。