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

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



답변

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

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

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

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

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

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

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


답변

난수를 원하면 난수 라이브러리를 사용하십시오. 효과적으로 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)


답변

그것은 매우 일반적인 질문입니다. 한 가지 대답은 “어떤 종류의 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를 생성 동일한 데이터). 이 속성은 일부 상황 (특히 콘텐츠 주소 지정 가능 스토리지 시나리오) 에서 매우 유용 할 수 있지만 특정 상황에서는 그렇지 않을 수 있습니다.


답변

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

V3 :

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

V4 :

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


답변