logo hsb.horse
← 스니펫 목록으로 돌아가기

Snippets

crypto.randomUUID의 Polyfill

crypto.randomUUID 함수의 폴리필 구현. 모든 브라우저에서 지원되므로 새로 구현할 필요는 없지만, UUID v4의 작동 원리를 배우기 위한 참고 자료로 유용하다.

게시일: 수정일:

모든 브라우저에서 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를 사용해야 한다
  • 이 구현은 학습 목적용이다
  • 성능은 네이티브 구현에 비해 떨어진다