SOURCE

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 命令行工具 X clear

                    
>
console