refactor: 使用浏览器Web Crypto API生成UUID

This commit is contained in:
dap
2026-03-23 21:05:46 +08:00
parent f0f24a09f5
commit 9d9991aa02

View File

@@ -1,42 +1,27 @@
const hexList: string[] = [];
for (let i = 0; i <= 15; i++) {
hexList[i] = i.toString(16);
function getBrowserCrypto(): Crypto {
const browserCrypto = globalThis.crypto;
if (!browserCrypto) {
throw new Error('Web Crypto API is not available in the current environment.');
}
return browserCrypto;
}
export function buildUUID(): string {
let uuid = '';
for (let i = 1; i <= 36; i++) {
switch (i) {
case 9:
case 14:
case 19:
case 24: {
uuid += '-';
break;
}
case 15: {
uuid += 4;
break;
}
case 20: {
uuid += hexList[(Math.random() * 4) | 8];
break;
}
default: {
uuid += hexList[Math.trunc(Math.random() * 16)];
}
}
}
return uuid.replaceAll('-', '');
return getBrowserCrypto().randomUUID().replaceAll('-', '');
}
let unique = 0;
export function buildShortUUID(prefix = ''): string {
const time = Date.now();
const random = Math.floor(Math.random() * 1_000_000_000);
const randomBuffer = new Uint32Array(1);
getBrowserCrypto().getRandomValues(randomBuffer);
const randomValue = randomBuffer[0];
const random = (randomValue ?? 0) % 1_000_000_000;
unique++;
return `${prefix}_${random}${unique}${String(time)}`;
}