모든 브라우저에서 crypto.randomUUID가 지원되므로, 이제 와서 이 폴리필을 구현할 필요는 없다. 하지만 UUID v4의 작동 원리를 이해하기에는 좋은 주제가 된다.
코드
type UUID = `${string}-${string}-${string}-${string}-${string}`;
const FN_NAME = "randomUUID";const BASE_STR = [1e7, 1e3, 4e3, 8e3, 1e11].join("-");
/** * UUID v4 생성 * 브라우저가 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);}UUID v4의 작동 원리
UUID v4는 무작위로 생성되는 128비트 식별자다. 표준 형식은 8-4-4-4-12의 36자(하이픈 포함)다.
- xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
- 13번째 문자는 항상 4(버전 표시)
- 17번째 문자는 8, 9, a, b 중 하나(variant 표시)
구현 설명
BASE_STR은 “10000000-1000-4000-8000-100000000000”이라는 템플릿이 된다. replace로 0, 1, 8 각 문자를 무작위 값으로 대체하여 UUID를 생성한다.
crypto.getRandomValues로 암호학적으로 안전한 난수를 가져오고, 비트 연산으로 UUID의 각 위치에 삽입한다.
주의사항
- 프로덕션 코드에서는 네이티브 crypto.randomUUID를 사용해야 한다
- 이 구현은 학습 목적용이다
- 성능은 네이티브 구현에 비해 떨어진다
hsb.horse