logo hsb.horse
← Retour à l’index des snippets

Snippets

Polyfill pour crypto.randomUUID

Implémentation polyfill de la fonction crypto.randomUUID. Tous les navigateurs la supportent maintenant, donc aucun besoin de nouvelle implémentation, mais cela sert de référence pour comprendre le mécanisme UUID v4.

Publié: Mis à jour:

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