Tous les navigateurs supportent désormais crypto.randomUUID, il n’est donc plus nécessaire d’implémenter ce polyfill. Cependant, cela reste un bon sujet pour comprendre le mécanisme UUID v4.
Code
type UUID = `${string}-${string}-${string}-${string}-${string}`;
const FN_NAME = "randomUUID";const BASE_STR = [1e7, 1e3, 4e3, 8e3, 1e11].join("-");
/** * Générer UUID v4 * Exécute l'implémentation polyfill si le navigateur ne supporte pas randomUUID */export function randomUUID(): UUID { const api = crypto; if (FN_NAME in api) return api[FN_NAME]();
return BASE_STR.replace(/[018]/g, replacer) as UUID;}
function replacer(char: string): string { const random = crypto.getRandomValues(new Uint8Array(1))[0]; const int = Number.parseInt(char); return (int ^ (random & (15 >> (int / 4)))).toString(16);}Le Mécanisme UUID v4
UUID v4 est un identifiant de 128 bits généré aléatoirement. Le format standard est 8-4-4-4-12, soit 36 caractères (tirets inclus).
- xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
- Le 13e caractère est toujours 4 (indique la version)
- Le 17e caractère est 8, 9, a ou b (indique la variante)
Explication de l’Implémentation
BASE_STR devient le modèle “10000000-1000-4000-8000-100000000000”. La génération d’UUID se fait en remplaçant les caractères 0, 1 et 8 par des valeurs aléatoires via replace().
crypto.getRandomValues fournit des nombres aléatoires cryptographiquement sûrs, et les opérations bit à bit les intègrent à chaque position de l’UUID.
Points d’Attention
- Utiliser crypto.randomUUID natif dans le code de production
- Cette implémentation est à but éducatif
- Les performances sont inférieures à l’implémentation native
hsb.horse