UUID vs ULID

June·2021년 12월 13일
6

[CS] CS 지식 정리

목록 보기
27/27

UUID

RFC UUID 공식 문서

UUID(Universally Unique Identifiers)는 범용 고유 식별자이다. 중앙관리식으로 유일성을 보장하는 방식이 아니다.

UUID는 32개의 16진수로 표시되며 8-4-4-4-12개의 그룹으로 구분되어서 표현된다.

123e4567-e89b-12d3-a456-426614174000

UUID의 버전

  1. version1 (datetime and MAC address)
  2. version2 (datetime and Mac address + DCE)
  3. version3 (namespace + MD5)
  4. version4 (random)
  5. version5 (namespace + SHA1 hash)

가장 많이 사용되는 것은 1, 4버전이고 4버전이 보다 더 많이 사용된다. 1버전의 경우 Mac address가 있기 때문에 드물지만 보안상의 문제가 생길 수도 있다.

import {v4 as uuidv4} from 'uuid';

let myuuid = uuidv4();

console.out('Your UUID is: ' + myuuid);
// Your UUID is: 8a6e0804-2bd0-4672-b79d-d97027f9071a

ULID

ULID Github
자바스크립트 ULID Github

ULID (Universally Unique Lexicographically Sortable Identifier)는 대소문자를 구별하지 않는 시간을 나타내는 10 글자와 16글자의 임의의 값으로 구성되어 있다.

ULID는 생성 순서를 밀리세컨 단위로 기록할 수 있어서, 생성 순서대로 정렬을 할 때 편하다.
만약 같은 밀리세컨드 단위까지 일치하는 시간에 만들어졌고, 여러 컴퓨터에서 사용한다면 순서는 랜덤이 된다.

애초에 ULID는 UUID의 단점을 극복하고자 만들어졌다. (UUID는 타임스탬프 같은 배경 없이 그냥 무작위의 값을 생성해낸다.)

Crockford’s Base32 에 기반해서 만들어졌기 때문에 (I, L, O, U)는 제외된다. (제외되는 이유는 사람 눈에 헷갈리기 때문이다). 또한 ULID는 UUID를 생성하는 것보다 나은 성능을 보이기도 한다.

https://medium.com/airframe/airframe-ulid-lexicographically-sortable-identifiers-for-scala-and-scala-js-c6530c10873e

충돌 가능성

위의 논리대로라면 1ms에 2^80개까지 만들수 있다는 것이다. 이 글 에서 충돌 가능성에 대해 분석을 해놨다.

monotonic option

또한 충돌가능성에 대비해서 monotonic option을 사용하면 어떤 랜덤한 숫자에서 1씩 증가하면서 충돌을 피하게 할 수도 있다.

import { monotonicFactory } from 'ulid'

const ulid = monotonicFactory()

// Assume that these calls occur within the same millisecond
ulid() // 01BX5ZZKBKACTAV9WEVGEMMVRZ
ulid() // 01BX5ZZKBKACTAV9WEVGEMMVS0

5개의 댓글

comment-user-thumbnail
2023년 8월 9일

ULID 대해서 가볍게 보고 싶었는데 잘봤습니당
감사해요

1개의 답글
comment-user-thumbnail
2024년 8월 22일

좋은 글 감사합니다. 한 가지 질문 드려요.

ULID (Universally Unique Lexicographically Sortable Identifier)는 대소문자를 구별하지 않는 시간을 나타내는 26자 글자와 16글자의 임의의 값으로 구성되어 있다.

이 부분은 잘못된 부분일까요? https://github.com/ulid/spec 문서에 따르면 ULID는 Timestamp 10자, 랜덤 16자로 총 26자로 표현된다고 나와있어서요.

ttttttttttrrrrrrrrrrrrrrrr

where
t is Timestamp (10 characters)
r is Randomness (16 characters)

오래된 포스팅이지만 혹시 댓글을 보신다면 확인 한번 부탁드릴게요😄

1개의 답글