어떤 UUID 버전을 사용해야합니까?


332

어떤 버전의 UUID를 사용해야합니까? 각 버전의 내용을 설명하는 많은 스레드를 보았지만 어떤 응용 프로그램에 가장 적합한 것이 무엇인지 파악하는 데 어려움을 겪고 있습니다.


2
당신의 선택은 무엇입니까?
Gabe

파이썬에서 작동하는 모든 것. 그래서 나는 이것이 docs.python.org/2/library/uuid.html 이라고 생각합니다 . 1,3,4,5.
user1802143

버전 3 및 5가 궁금하다면이 질문, v5 UUID 생성을 참조하십시오 . 이름과 네임 스페이스 란 무엇입니까? .
Basil Bourque

답변:


414

UUID를 생성하는 방법에는 두 가지가 있습니다.

고유 한 ID 만 있으면 버전 1 또는 버전 4가 필요합니다.

  • 버전 1 : 네트워크 카드 MAC 주소와 타이머를 기반으로 고유 ID를 생성합니다. 이 ID는 예측하기 쉽고 (다른 이름으로 추측 할 수 있음) 네트워크 카드로 다시 추적 할 수 있습니다. 이것을 만드는 것은 권장하지 않습니다.

  • 버전 4 : 이들은 임의의 (또는 의사 난수) 숫자로 생성됩니다. UUID를 생성하기 만하면 원하는 것입니다.

주어진 이름에서 항상 동일한 UUID를 생성해야하는 경우 버전 3 또는 버전 5가 필요합니다.

  • 버전 3 : 네임 스페이스 및 이름의 MD5 해시에서 고유 ID를 생성합니다. 이전 버전과의 호환성 (이름에서 UUID를 생성하는 다른 시스템과의 호환성)이 필요한 경우이를 사용하십시오.

  • 버전 5 : 네임 스페이스 및 이름의 SHA-1 해시에서 고유 ID를 생성합니다. 이것은 선호하는 버전입니다.


17
reproducible주어진 이름에서 UUID 를 생성해야하는 경우 버전 3 또는 버전 5가 필요합니다. 해당 알고리즘에 동일한 입력을 제공하면 동일한 출력을 생성합니다.
anregen

3
클라우드 컴퓨팅 환경 (예 : AWS 또는 GAE)에서는 버전 1의 약점이 망각으로 완화되는 것처럼 보입니다. 시간이 지남에 따라 특정 응용 프로그램의 UUID 생성기에 수천 개의 서로 다른 MAC 주소가 적용되어 예측 가능성 및 / 또는 추적 성을 제거 할 수 있습니다.
버팔로 Rabor

3
@ user239558 UUID의 목표는 고유성이라는 점을 감안할 때 여전히 UUIDv5를 선호 할 수 있습니다.
Epicurist

7
"권장되지 않음"버전 1에 대한 의견은 지나치게 단순합니다. 많은 상황에서, 이들은 실제로 훌륭하고 바람직합니다. 그러나 신뢰할 수없는 행위자가 사용할 수있는 UUID에서 이러한 정보를 유출하는 것에 대한 보안 문제가있는 경우 : (a) UUID를 생성하는 머신의 MAC 주소 또는 (b) 생성 된 날짜-시간, 그런 다음 버전 1을 피하십시오.이 두 가지 정보가 민감 하지 않은 경우 버전 1을 사용하는 것이 좋습니다.
Basil Bourque 2016 년

9
버전 2는 어떻게 되었습니까?
Matthew Woo

53

난수를 원하면 난수 라이브러리를 사용하십시오. 효과적으로 0.00 ... 많은 0을 더 가지고 여기에서 001 %의 충돌 확률을 가진 고유 한 식별자를 원한다면 UUIDv1을 사용해야합니다. UUIDv3 및 v5에 대한 Nick의 게시물을 참조하십시오.

UUIDv1은 안전하지 않습니다. 그런 것이 아닙니다. 그것은 추측 할 수없는 고유해야합니다. UUIDv1은 현재 타임 스탬프와 머신 식별자 및 임의의 랜덤 항목을 사용하여 해당 알고리즘에 의해 다시 생성되지 않는 숫자를 만듭니다. 이는 모든 사람이 수백만 건의 트랜잭션을 수행하더라도 트랜잭션 ID에 적합합니다.

솔직히 말해서, UUIDv4가 존재하는 이유를 이해하지 못합니다 ... RFC4122 를 읽은 후에 는 해당 버전이 충돌 가능성을 없애지 않는 것처럼 보입니다. 난수 생성기 일뿐입니다. 사실이라면 세계에서 두 대의 컴퓨터가 결국 동일한 "UUID"v4를 생성 할 가능성이 매우 높습니다 (U.niversal U.niqueness를 보장하는 메커니즘이 없기 때문에 인용). 이 상황에서 알고리즘이 고유 한 값을 생성하는 방법을 설명하는 RFC에 속한다고 생각하지 않습니다. 임의성 생성에 대해서는 RFC에 속합니다. 임의의 숫자 세트의 경우 :

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

67
당신이하지 않는 한이 UUID 버전 4 구현, 충돌 볼 수 없습니다 당신이 세기 억 UUID를 매초마다 생성 동전 던지기 승리 . 매우 큰set_size 2 ^ 122임을 기억하십시오 .
케빈

8
V4 알고리즘은 직렬이 아니므로 v4에서 생성 된 처음 두 UUID가 일치 할 가능성이 있습니다. 많은 옵션이 있다고해서 반복을 생성하기 전에 고유 한 옵션이 부족하다는 의미는 아닙니다. 언제든지 발생할 수 있습니다.
anregen

7
실제로 수학을하는 데 실패했습니다. 우리는 (종으로서) 매초 10 억 개의 UUID를 생성하지 않습니다. 우리는 그래서 이상 (평균) 첫 충돌 할 때까지 백년 이상.
케빈

31
V4는 "충돌"할 수 있지만, 대부분의 유스 케이스에서 그만한 가치가있는 가능성은 매우 낮습니다. Re : "세계에서 두 대의 컴퓨터가 결국 동일한 'UUID'v4를 생성합니다."물론입니다. 그러나 UUID를 사용하는 세계의 대부분의 컴퓨터가 다른 상황에서 사용하기 때문에 문제가되지 않습니다. 내 자신의 내부 앱과 동일한 UUID를 내부 앱과 동일하게 생성하면 문제가되지 않습니다. 충돌은 동일한 상황에서 발생하는 경우에만 중요합니다. (앱 내에서도 많은 UUID가 전체 앱에서 고유 할 필요는 없으며 사용 된 컨텍스트 만 기억하십시오)

6
따라서 Guid를 보호 할 필요가없는 경우 버전 1을 사용하십시오. 보안이 필요하고 운이

16

그것은 매우 일반적인 질문입니다. 한 가지 대답은 "어떤 종류의 UUID를 생성 하느냐에 달려 있습니다"입니다. 그러나 더 좋은 방법은 다음과 같습니다. "응답하기 전에 대부분의 최신 운영 체제에서 제공하는 UUID 생성 기능을 호출하는 대신 왜 고유 한 UUID 생성 알고리즘을 코딩해야하는지 알려 주실 수 있습니까?"

그렇게하는 것이 더 쉽고 안전하며 직접 생성 할 필요 가 없으므로 구현을 코딩하는 데 왜 귀찮습니까? 이 경우 답변은 O / S, 프로그래밍 언어 또는 프레임 워크가 제공하는 모든 것을 사용합니다. 예를 들어, Windows에는 CoCreateGuid 또는 UuidCreate 또는 사용중인 수많은 프레임 워크에서 사용 가능한 다양한 래퍼 중 하나가 있습니다. Linux에는 uuid_generate가 있습니다.

당신이 경우, 어떤 이유로, 절대적 후 적어도 수있는 좋은 감각을 가지고, 자신을 생성 할 필요가 멀리 V1 및 V2 UUID를 생성하지합니다. 그 권리를 얻는 것은 까다 롭습니다. 대신 v3, v4 또는 v5 UUID를 사용하십시오.

업데이트 : 코멘트에, 당신은 당신이 파이썬과 링크를 사용하고 있는지 언급 . 제공된 인터페이스를 살펴보면 가장 쉬운 옵션은을 호출하여 v4 UUID (임의 데이터에서 생성 된 UUID)를 생성하는 것 uuid.uuid4()입니다.

UUID를 생성하기 위해 해시해야 할 일부 데이터가있는 경우 v3 (MD5에 의존) 또는 v5 (SHA1에 의존)를 사용할 수 있습니다. v3 또는 v5 UUID 생성은 간단합니다. 먼저 생성하려는 UUID 유형을 선택하고 (v5를 선택해야 함) 적절한 네임 스페이스를 선택하고 UUID를 생성하는 데 사용하려는 데이터로 함수를 호출하십시오. 예를 들어 URL을 해시하는 경우 다음을 사용합니다 NAMESPACE_URL.

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

이 UUID는 동일한 URL에 대해 v5 UUID와 다르며 다음과 같이 생성됩니다.

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

v3 및 v5 URL의 좋은 특성은 구현간에 상호 운용 가능해야한다는 것입니다. 즉, 만약 두 개의 서로 다른 시스템은 RFC4122을 준수, 그들은 (또는 적어도 것을 구현을 사용 한다 다른 모든 조건이 동일 경우) 모두, 즉 동일한 네임 스페이스와 함께, 같은 버전의 UUID를 생성 (동일한 UUID를 생성 동일한 데이터). 이 속성은 일부 상황 (특히 콘텐츠 주소 지정 가능 스토리지 시나리오) 에서 매우 유용 할 수 있지만 특정 상황에서는 그렇지 않을 수 있습니다.


4
OP가 묻지 않았기 때문일 것입니다. "대부분의 최신 운영 체제에서 제공하는 UUID 생성 기능을 호출하는 대신 [자신의] UUID 생성 알고리즘을 어떻게 코딩합니까?"
anregen

그 외에도 UUIDv3 및 v5에 대한 좋은 설명이라고 생각합니다. v1이 좋은 선택이라고 생각하는 이유는 아래 답변을 참조하십시오.
anregen

NAMESPACE_URL은 무엇입니까? 내가 얻을 수있는 변수입니까? 어디서?
stackdave

@stackdave NAMESPACE_URLRFC-41226ba7b811-9dad-11d1-80b4-00c04fd430c8 30 페이지의 권장 사항에 따라 일반적으로와 동일한 UUID 입니다.
Jamie Ridding

2

Postgres 설명서 는의 차이점을 설명합니다 UUID. 그들 중 몇 가지 :

V3 :

uuid_generate_v3(namespace uuid, name text) -이 함수는 지정된 입력 이름을 사용하여 지정된 네임 스페이스에서 버전 3 UUID를 생성합니다.

V4 :

uuid_generate_v4 -이 함수는 버전 4 UUID를 생성하며 이는 완전히 임의의 숫자에서 파생됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.