33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
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;
|
|
}
|