UUID 가 나에게 정말로 중요했던 첫 번째 시간,나는 WordPress 에 인접한 SaaS 를 단일 MySQL 상자에서 읽기 복제본이있는 설정으로 옮기고 나중에 파쇄 할 계획이었습니다. 자동 증가 ID 는 수년 동안 괜찮 았어 - 두 서비스가 동일한 논리 테이블이 될 것에 삽입하기 시작할 때까지,그리고 갑자기 id = 42 는 두 개의 다른 행을 의미했다. That's 순간 자동 증가 조용히 작동을 중지하고,UUIDs 는 일반적인 대답이다.
UUID 는 어떤 기계에서도 언제든지,아무 조정도 없이,그리고 여전히 유일하다고 믿을 수 있는 128 비트 값이다. 그 "no coordination" 부분은 전체 요점이다: 비행기에서 오프라인으로 모바일 앱,3 개의 마이크로서비스,그리고 백그라운드 워커는 모두 ID 를 동시에 주조할 수 있고 결코 충돌하지 않는다. 자신감이 진정으로 터무니없다는 수학적인 뒷받침과 I'll 은 초 만에 얼마나 터무니없는지를 보여줄 것이다.
X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X UUID 생성기 on Toolz.dev 는 여러 버전의 단일 또는 대량 UUID 를 즉시 브라우저에서 바로 만듭니다 - you're seeding a table 또는 테스트를 위해 일회용 ID 가 필요할 때 편리합니다. 이 가이드는 버전이 실제로 의미하는 바,2026 년에 선택할 항목,데이터베이스 인덱스를 파괴하지 않고 저장하는 방법,그리고 건너뛸 수 있도록 제가 저지른 실수를 다룹니다.
TL;DR: 2026년에 새로운 데이터베이스 기본 키를 생성하려면 다음을 생성하세요 UUID v7- it's 시간 순서 그래서 그것은 잘 색인,그리고 그것은 does't 는 v1 같은 하드웨어를 누출. 사용 v4 순수한 예측 불가능성을 원할 때. 네이티브로 저장하세요
uuid유형 또는BINARY(16), 절대VARCHAR(36). the 와 함께 대량으로 만드십시오 UUID 생성기그리고 그것을 와 짝을 이루세요 타임스탬프 변환기 v7 에 구운 시간을 읽으려면 모든 클라이언트 측, 모두 무료.
UUID란 정확히 무엇입니까?
UUID (Universally Unique Identifier) 는 중앙 기관이 ID 를 나눠주지 않고 무언가를 식별하는 데 사용되는 128 비트 숫자입니다. Microsoft 는 동일한 것을 GUID (Globally Unique Identifier) 라고 부릅니다; they're 는 중요한 모든면에서 동일합니다. 정식 텍스트 형식은 36 자입니다 - 32 개의 16 진수 숫자는 8-4-4-4-12 의 하이픈으로 연결된 5 개의 그룹으로 나뉩니다:
550e8400-e29b-41d4-a716-446655440000
그 육각 위치의 두 aren't 임의의 데이터 - they're 메타데이터. 13 번째 육각 숫자는 the 를 인코딩합니다 버전 (어떤 세대 전략이 성공했는지) 네 번째 그룹의 첫 번째 숫자는 다음을 인코딩합니다 변형 (어떤 레이아웃 표준을 따르는지 - 8, 9, a, 또는 b 표준 UUID의 경우). 따라서 위의 예에서는 4 세 번째 그룹에서는 it's a v4를 알려줍니다.
얼마나 독특한가 "unique, " 정말?
버전과 변형 비트가 예약된 후 v4 UUID 는 122 개의 랜덤 비트를 갖는다. That's 2^122 가능한 값,또는 약 5,3 언데실리온:
5,316,911,983,139,663,491,615,228,241,121,400,000
이를 구체적으로 만들려면: 매초 10억 UUID를 생성했다면 you'd의 확률이 50%라도 도달하려면 대략 86년이 필요합니다 싱글 어디서나 충돌합니다. 실제 엔지니어링 측면에서 v4 충돌은 발생하지 않으며,절대 발생하지 않는 것처럼 설계할 수 있습니다.
What's UUID v1, v4, v7의 차이점?
사양 - 원래 RFC 4122, 이제 업데이트되었습니다 RFC 9562(2024)- 여러 버전을 정의합니다. 일상 업무에 세 가지 문제가 있습니다.
UUID v1 - 타임스탬프 + MAC 주소
v1 는 네트워크 card's MAC 주소로 100 나노초 타임 스탬프 (1582 년 10 월 15 일,그레고리력이 시작된 날짜 - 내가 가장 좋아하는 사양 퀴즈 중 하나에서 계산) 를 함께 꿰매어줍니다. It's 는 자연스럽게 시간 순서가 지정되며,그것에서 생성 시간을 추출할 수 있습니다.
문제는 바로 정의에 있습니다: 그것을 만든 기계의 MAC 주소를 내장합니다. 그것은 하드웨어 ID 를 유출하고 타임스탬프와 결합하여 ID 를 다소 예측 가능하게 만듭니다. 예: 6ba7b810-9dad-11d1-80b4-00c04fd430c8. I'd 는 레거시 호환성을 위해 v1 만 지금 사용합니다.
UUID v4 - 무작위
v4 는 무작위성의 122 조금이고 다른 것은 없습니다. It's 버전은 대부분의 사람들이 "UUID,"라고 말할 때 의미합니다. 그리고 it's dead simple: 타임스탬프 없음,하드웨어 없음,주문 없음 예: f47ac10b-58cc-4372-a567-0e02b2c3d479.
거꾸로 아무것도 유출 하 고 예측할 수 없는, 정확히 당신이 원하는 것 이다 아무것도 should't 추측 수 있습니다. 단점은 it's 무작위따라서 연속 삽입은 인덱스 전체에 분산됩니다. 제가 알아낸 것처럼 규모에 따른 실제 성능 비용이 발생합니다.
UUID v7 - 시간 순서 + 무작위
v7 은 RFC 9562 에서 표준화된 현대의 절충안이다. 처음 48 비트는 밀리초 단위의 유닉스 타임스탬프이다; 나머지는 무작위이다. 예: 018e4880-d4d0-7b9c-8c37-2a5c0f1e3d8a.
그 레이아웃은 v7 ID 가 시간순으로 정렬됨을 의미합니다 - 새로운 행은 산란 대신 B-트리 인덱스의 "end"에 착륙합니다 - 여전히 전역적으로 독특하고 조정이 필요 없습니다. 대략적인 생성 시간 (보통 미세) 이 누출되지만 하드웨어는 누출되지 않습니다. 새로운 프로젝트의 경우 이것이 기본 기본 키이며 it's IETF 가 이제 가리키는 방향도 마찬가지입니다.
Here's 한눈에 절충안:
| 버전 | 주문하셨나요? | 누출 | 위한 최고의 |
|---|---|---|---|
| v1 | 예 (시간) | MAC 주소 + 시간 | 레거시 시스템만 해당됩니다 |
| v4 | 아니요 (무작위) | 아무것도 | 추측할 수 없는 토큰, 일반 ID |
| v7 | 예 (시간) | 대략적인 생성 시간 | 새 데이터베이스 기본 키 |
덜 사용되는 버전도 존재합니다: v3 및 v5 는 네임스페이스에 이름을 더한 결정론적 해시이고 (v5 는 SHA-1 을 사용하며 v3's MD5 보다 선호됨), v6 은 재정렬된 v1 이며,v8 은 사용자 지정 구현을 위해 예약되어 있습니다.
UUID 또는 자동 증가 ID를 사용해야 합니까?
이것은 논쟁 I & #39;ve 다른 어떤 것보다 더 많은 디자인 리뷰에서 가지고 있었기 때문에 here & #39;s는 종교적 대답보다는 실제로 사용하는 프레임 워크입니다.
때 자동 증가로 찌르십시오 당신은 단 하나 데이타베이스가 있고,성과 및 저장은 단단하,인간은 IDs 를 읽을 필요가 있습니다. 정수는 UUID's 16 에 대하여 4–8 바이트,정수 비교는 더 빠릅니다,그리고 "order #12345"는 36 문자 UUID 보다는 전화를 아래로 읽는 것이 매우 쉽습니다. 샤딩 없는 단 하나 상자에,자동 증가는 진짜로 더 간단하고,빠른 선택입니다 - 유행에서 UUIDs 를 위한 don't 도달.
UUID 로 전환 언제 이들 중 어느 것이든 사실입니다: you're distributed (여러 서비스 또는 서버가 독립적으로 ID 를 주조함), you're 열거에 대해 걱정함 (자동 증가 ID 는 추측 가능하며 조용히 레코드 수를 나타냅니다 - /users/1234 공격자에게 사용자가 1,235 명 미만이라고 알려줌), 충돌 없이 여러 데이터베이스의 데이터를 병합해야 하거나 클라이언트가 동기화하기 전에 ID 를 생성하기를 원합니다. 그 열거 지점은 사람들이 과소평가하는 실제 보안 고려 사항입니다.
그리고 v7 중간지대: UUID v7은 UUID의 분산 생성을 제공합니다 그리고 기록 유출 없이 인덱스 친화적인 자동 증가 순서가 중요합니다. 비순차적 ID가 필요한 2026년 대부분의 신규 프로젝트에서 v7이 논쟁을 끝내는 답입니다.
지수를 손상시키지 않고 UUID를 어떻게 저장합니까?
이것은 내 자신의 값 비싼 실수에서 태어난 섹션이므로 다른 곳이 없다면 여기에주의를 기울이십시오.
제가 언급한 마이그레이션에서 새 UUID를 다음과 같이 저장했습니다 VARCHAR(36) 왜냐하면 그것은 명백하고 읽을 수 있는 일이었기 때문입니다. 효과가 있었고 - 그리고 나서 테이블이 커졌고,삽입과 조인이 측정가능할 정도로 느려졌습니다. 두 가지 문제가 복합적으로 작용했습니다: 저는 ID 당 16 바이트 대신 36 바이트를 쓰고 있었습니다 그리고 나는 임의의 v4 UUID 를 사용하고 있었기 때문에 모든 삽입은 primary-key 인덱스의 임의의 지점에 착륙하여 조각화하고 버퍼 풀을 스래싱했습니다. 수정 사항은 바이너리로 저장하고 다음 프로젝트에서 v7 로 전환하여 삽입이 순차적으로 유지되었습니다.
PostgreSQL 원주민이 있습니다 uuid 유형 - 그것을 사용하십시오. 그것은 16 바이트를 저장하고 빨리 비교합니다:
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
MySQL 네이티브 UUID 유형이 없으므로 저장하세요 BINARY(16) 그리고 로 변환하세요 UUID_TO_BIN() / BIN_TO_UUID(). 두 번째 주장은 중요합니다:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- The `true` swaps the timestamp bytes for better index locality on v1
INSERT INTO users (id, name, email)
VALUES (UUID_TO_BIN(UUID(), true), 'Alice', '[email protected]');
SELECT BIN_TO_UUID(id, true) AS id, name, email FROM users;
기억해야 할 규칙: 네이티브 uuid 있는 곳에 입력하세요 BINARY(16) where you don't, 그리고 VARCHAR(36) 기본적으로 키 you'll 인덱스 및 조인을 위해 결코.
코드에서 UUID를 어떻게 생성합니까?
빠른 일회성을 위해 UUID 생성기 REPL 을 여는 것보다 빠릅니다. 코드에서는 모든 주요 언어가 이 기능을 내장하거나 한 걸음 떨어져 있습니다.
자바스크립트 / 타입스크립트- 브라우저와 노드는 모두 이제 v4 생성기를 제공합니다:
const id = crypto.randomUUID(); // v4, no dependency needed
// For v7, use the 'uuid' package:
import { v7 as uuidv7 } from 'uuid';
const ordered = uuidv7();
파이썬:
import uuid
uuid.uuid4() # random
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') # deterministic (SHA-1)
자바: UUID.randomUUID() 상자에서 v4를 제공합니다; v7에는 다음과 같은 라이브러리가 필요합니다 java-uuid-generator 또는 작은 RFC 9562 구현.
가다: github.com/google/uuid 둘 다 제공합니다 - uuid.New() v4 및 uuid.NewV7() v7의 경우.
참고 네이티브 런타임 도우미는 거의 항상 v4 를 제공 합니다. 만약 당신이 특별히 그것의 순서를 위해 v7 을 원한다 면,당신은 일반적으로 라이브러리가 필요 합니다,it's 이후 새로운 표준과 모든 stdlib 따라잡은.
UUID는 실제 시스템에서 실제로 어디에 표시됩니까?
It's 추상적으로 UUID에 대해 이야기하기 쉽기 때문에 I've가 의존한 구체적인 장소는 다음과 같습니다. 선택한 버전은 실제로 작업에 따라 다르기 때문입니다.
분산 설정의 데이터베이스 기본 키. 이것은 고전적인 경우이고 나를 위해이 기사를 시작한 것입니다. 한 명 이상의 작가가 동일한 논리 테이블에 삽입 할 수있는 순간 - 복제본,파편 또는 스키마를 공유하는 두 개의 서비스 - 자동 증가 중단. v7 기본 키는 조정 문제를 해결하고 여전히 it & # 39;s 시간 순서대로 있기 때문에 깔끔하게 인덱싱합니다.
오프라인 우선 앱에 대한 클라이언트 생성 ID입니다. 모바일 앱이나 브라우저 SPA 는 종종 서버와 대화하기 전에 레코드를 만들어야 합니다 - 평면에 쓰여진 메모를 생각하거나,새로운 행을 즉시 보여주는 낙관적인 UI 를 생각하십시오. 클라이언트가 UUID 를 미리 민트하면 레코드는 첫 번째 키 입력에서 안정적인 ID 를 가지며 나중에 서버 왕복 없이 동기화됩니다. "get an ID." I've used this to make forms feel instant on even on flaky connections.
URL 및 API의 열거할 수 없는 리소스 식별자입니다. 퍼팅 /orders/1042 URL에서 조용히 누구에 게 당신이 & # 39;ve 최대 1,042 주문 했다, 그리고 그들이 걸을 수 있습니다 /orders/1041, /orders/1040등등. UUID 에서 스와핑하면 비즈니스 측정 누수와 쉬운 열거가 모두 제거됩니다. 사용자가 URL 에서 볼 수있는 모든 것에 대해 이것은 가치가 있습니다 - UUID 는 액세스 제어 메커니즘이 아니라는 것을 기억하지만; 당신은 여전히 그 뒤에 실제 권한 부여 검사가 필요합니다.
추적을 위한 상관 ID입니다. 하나의 요청이 5 개의 마이크로서비스에 걸쳐 팬을 퍼뜨릴 때, 하나의 UUID를 상관관계 ID로 첨부하고 모든 홉 턴에서 로깅하는 "somewhere in this mess something failed" into a single greppable string across all your logs. 이것은 평범한 v4조차도 완벽한 한 곳입니다 - you don't need ordering, just uniqueness.
동일성 키. 지불과 웹훅 API 는 종종 재시도된 요청이 카드를 두 번 충전하도록 UUID 를 멱등성 키로 보내달라고 클라이언트에게 요청한다. 클라이언트는 한 번 생성하고 재시도 시 재사용하며 서버는 그 위에 있는 매우 비싼 버그 클래스를 방지하는 작은 패턴을 it's.
자주 묻는 질문
UUID는 어떤 용도로 사용되나요?
UUID 는 ID 를 나눠주기 위해 중앙 서비스가 필요 없이 데이터베이스 행,API 리소스,세션, 업로드된 파일,마이크로 서비스 전반의 추적 등 무언가를 고유하게 식별합니다. It's the go-to whenever multiple systems or clients must create identifiers independently and still be sure they won't clash.를 사용하여 즉시 생성할 수 있습니다 UUID 생성기 Toolz.dev에서.
두 UUID가 동일할 수 있나요?
이론적으로는 그렇습니다; 실제로는 아닙니다. v4 UUID 는 122 개의 랜덤 비트를 가지고 있어 약 5,3 억 개의 가능성을 제공합니다. You'd 는 한 번의 충돌이라도 50%의 확률에 도달하기 전에 2,7 경 UUID 정도의 순서로 생성해야 합니다. 모든 실제 엔지니어링 목적에 대해 UUID 를 고유한 보장으로 취급할 수 있습니다.
2026 년에는 어떤 UUID 버전을 사용해야 하나요?
새로운 데이터베이스 기본 키의 경우 UUID v7 - it's 는 전 세계적으로 고유성을 유지하면서 효율적인 인덱싱을 위해 시간 순서가 지정되었으며 it's 는 RFC 9562 아래의 현재 IETF 권장 사항입니다. v4 를 사용하여 추측할 수 없는 식별자와 같이 예측 불가능성이 중요한 경우 v1 을 생성 기계's MAC 주소를 내장하므로 새 작업에 v1 을 피하십시오.
UUID는 순차적입니까?
v1 과 v7 은 시간 순서가 지정되어 있으므로 나중에 생성된 ID 는 이전 ID 다음에 정렬됩니다; v4 는 순서가 없는 완전 무작위입니다. 순차 순서는 v7 을 B-트리 인덱스에 친숙하게 만드는 요소입니다 - 분산이 아닌 새 행이 추가됩니다. 만약 you're 가 무작위 v4 를 큰 테이블의 기본 키로 사용한다면,그 순서 부족은 삽입 및 인덱스 성능을 저하시킬 수 있습니다.
UUID를 데이터베이스에 어떻게 저장해야 합니까?
네이티브를 사용하세요 uuid 데이터베이스에 하나가 있으면 입력합니다 (PostgreSQL 은 그렇습니다). 그렇지 않으면 저장합니다 BINARY(16)그리고 MySQL 8.0+에서는 로 변환합니다 UUID_TO_BIN() 그리고 BIN_TO_UUID(). 피하다 VARCHAR(36) 또는 CHAR(36) 키의 경우 문자열 저장은 행당 20바이트를 낭비하고 모든 비교 속도를 늦추어 큰 테이블에서 빠르게 합산됩니다.
What's UUID 와 GUID 의 차이점?
They're 같은 것입니다. UUID 는 대부분의 언어와 플랫폼에서 사용되는 RFC 4122 의 용어입니다; GUID 는 Windows 및 닷넷에서 흔히 사용되는 Microsoft's 이름입니다. 형식과 보증이 동일하므로 GUID 와 UUID 를 상호 교환 적으로 처리 할 수 있습니다.
UUID에서 생성 시간을 추출할 수 있나요?
v1, v6, v7부터 그렇습니다. 그들은 타임스탬프를 인코딩합니다. v7은 처음 48비트에 밀리초 Unix 타임스탬프를 저장하며, 이를 디코딩하고 읽을 수 있습니다 타임스탬프 변환기. v4 와 v5 는 시간 정보를 포함하지 않으므로,there's 는 그것들로부터 추출할 것이 아무것도 없다.
UUID v4 는 세션 토큰에 충분히 안전합니까?
그 자체로는 아닙니다. v4's 122 랜덤 비트는 예측할 수 없지만 세션 및 인증 토큰은 일반적으로 암호화로 안전한 생성기에서 최소 256 비트를 원합니다. auth 용으로 특수 제작된 보안 랜덤 토큰을 사용하고 리소스를 보호하기보다는 식별하기 위해 UUID 를 예약합니다.
UUID 는 어떻게 생성하나요?
당신의 language's 붙박이 발전기를 사용하십시오: crypto.randomUUID() 최신 브라우저와 Node.js 에서는 uuid.uuid4() 파이썬에서, 또는 Guid.NewGuid() 닷넷에서는 각각 단일 호출로 v4 UUID를 생성합니다. 빠른 일회성 또는 배치를 위해 즉시 생성하십시오 UUID 생성기 Toolz.dev 에서 - 코드가 필요하지 않습니다.
UUID 는 몇 자입니까?
UUID 는 그것의 표준 텍스트 형태에서 36 자이다: 32 개의 16 진수 숫자 플러스 8-4-4-4-12 그룹으로 그것을 분할하는 4 개의 하이픈. 그 텍스트는 128 비트를 인코딩하므로 16 원시 바이트로 저장하는 것입니다 BINARY(16) 36자 문자열보다 훨씬 더 컴팩트합니다.
감싸는 중
UUIDs 는 당신이 don't 에 관하여 생각하는 기초의 한개 체계가 단 하나 데이타베이스를 지나서 성장할 때까지 이다 - 그리고 그 후에 they're 전부. 2026 짧은 버전: 과태에 v7 새로운 기본 키의 경우 다음을 사용하십시오 v4 추측할 수 없는 ID가 필요할 때, 로 저장하세요 네이티브 uuid 또는 BINARY(16)그리고 새로운 것은 v1 을 건너뜁니다. learn from my VARCHAR(36) 오후 그래서 당신은 don't 반복.
무료로 즉시 생성하세요 UUID 생성기 on Toolz.dev - 싱글 혹은 벌크,어떠한 버전이든,아무것도 업로드되지 않은 모든 클라이언트 측. v7 내부의 시간을 읽어야 할 때,reach for the 타임스탬프 변환기그리고 나머지 부분을 찾아보세요 코딩 도구- 600+ 무료 유틸리티 - 이상 Toolz.dev.



