UUID

UUID 란

Universally Unisque Identifier의 양자로 범용 고유 식별자를 나타낸다.
네트워크 상에서 고유성이 보장되는 id를 만들기 위한 표준 규약이다.

UUID는 128 비트의 숫자이며 32자리의 16진수로 표현된다. 총 36개의 문자
8-4-4-4-12 개의 숫자패턴과 하이픈을 사용하요 5개의 그룹으로 구분한다.

이름 길이 (바이트) 길이 (16진수 숫자) 내용
time_low 4 8 시간의 low 32비트를 부여하는 정수
time_mid 2 4 시간의 middle 16비트를 부여하는 정수
time_hi_and_version 2 4 최상위 비트에서 4비트 "version", 그리고 시간의 high 12비트
clock_seq_hi_and_res clock_seq_low 2 4 최상위 비트에서 1-3비트, 그리고 13-15비트 클럭 시퀀스
node 6 12 48비트 노드 id

대략 이렇게 생겼다

550e8400-e29b-41d4-a716-446655440000

UUID로 표현가능한 생성 개수는 어마어마하게 커서 중복될 가능성이 아주 낮다

종류

원하는 타입에 따라 생성하는 방식이 조금씩 다른데, 일반적으로 5가지의 종류가 있다.

  1. v1: 타임스탬프(시간) 기준
  2. v2: 타입스탬프 + DCE 보안
  3. v3: MD5 해시 기준
  4. v4: 랜덤값 기반
  5. v5: SHA-1 해시 기준

랜덤값 기반으로 생성되는 v4가 가장 많이 사용되고, 다음으로는 시간 기준인 v1이 많이 사용된다.

Node.js에서 사용

npm 라이브러리에 uuid가 있어서 간단하게 사용할 수 있다.
자세한 방법은 공식문서 참조
https://www.npmjs.com/package/uuid

npm install uuid

import

const { v4 : uuidv4 } = require('uuid')l
// or
import { v4 as uuidv4 } from 'uuid';

사용

uuid에서 불러온 함수를 실행시키면 string 타입의 uuid를 반환한다.

const uuid = uuidv4();

UUID PK

UUID를 PK로 설정할 수 있지만 UUID를 DB에 저장할 때 발생할 수 있는 문제점이 있다.

아래 글에서 UUID 값을 인덱싱 가능하고 순서를 보장받는 체계로 변경하는 방법이 설명되어 있다.
Storing Universal Unique Identifier (UUID) Values in MySQL - Karthik Appigatla

UUID의 5개 그룹의 순서를 변경한다. (4번째 그룹은 타임스탬프를 포함한다.)
하이픈을 제거하여 검색을 빠르게 한다
즉 1-2-3-4-5 의 구조를 32145로 변경하면 어느 정도 보장받는 수체계로 변환할 수 있다.

이를 node에서 사용하면 다음과 같이 활용할 수 있다.

const uuid = () => {
    const tokens = v4().split('-')
    return tokens[2] + tokens[1] + tokens[0] + tokens[3] + tokens[4];
}

uuid();

references