class UUID {
/**
* 生成指定长度的唯一标识符
*/
generated() {
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const hex = Array.from(bytes)
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
const versionedHex = hex.slice(0, 12) + "4" + hex[12] + hex.slice(14);
const variantHex =
versionedHex.slice(0, 16) +
((parseInt(versionedHex[16], 16) & 0x3) | 0x8).toString(16) +
versionedHex.slice(17);
return [
variantHex.slice(0, 8),
variantHex.slice(8, 12),
variantHex.slice(12, 16),
variantHex.slice(16, 20),
variantHex.slice(20, 32),
].join("-");
// 短格式: 每 N 位用连字符分隔
const segmentSize = 4;
const segments = [];
for (let i = 0; i < hex.length; i += segmentSize) {
segments.push(hex.slice(i, i + segmentSize));
}
return segments.join("-");
}
/**
* 生成无连字符的唯一标识符
*/
noHyphen() {
return this.generated().replace(/-/g, "");
}
}
const uuid = new UUID();
console.log(uuid.generated())
console.log(uuid.noHyphen())
console