export function createUuid() { const webCrypto = globalThis.crypto; if (typeof webCrypto?.randomUUID === 'function') { return webCrypto.randomUUID(); } const bytes = createRandomBytes(16); bytes[6] = (bytes[6] & 0x0f) | 0x40; bytes[8] = (bytes[8] & 0x3f) | 0x80; const hex = Array.from(bytes, (value) => value.toString(16).padStart(2, '0')); return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10).join('')}`; } export function createRandomHex(length: number) { const normalizedLength = Math.max(0, Math.floor(length)); return Array.from(createRandomBytes(Math.ceil(normalizedLength / 2)), (value) => value.toString(16).padStart(2, '0')) .join('') .slice(0, normalizedLength); } function createRandomBytes(length: number) { const bytes = new Uint8Array(length); const webCrypto = globalThis.crypto; if (typeof webCrypto?.getRandomValues === 'function') { webCrypto.getRandomValues(bytes); return bytes; } for (let index = 0; index < bytes.length; index += 1) { bytes[index] = Math.floor(Math.random() * 256); } return bytes; }