어떤 버전의 UUID를 사용해야합니까? 각 버전의 내용을 설명하는 많은 스레드를 보았지만 어떤 응용 프로그램에 가장 적합한 것이 무엇인지 파악하는 데 어려움을 겪고 있습니다.
어떤 버전의 UUID를 사용해야합니까? 각 버전의 내용을 설명하는 많은 스레드를 보았지만 어떤 응용 프로그램에 가장 적합한 것이 무엇인지 파악하는 데 어려움을 겪고 있습니다.
답변:
UUID를 생성하는 방법에는 두 가지가 있습니다.
고유 한 ID 만 있으면 버전 1 또는 버전 4가 필요합니다.
버전 1 : 네트워크 카드 MAC 주소와 타이머를 기반으로 고유 ID를 생성합니다. 이 ID는 예측하기 쉽고 (다른 이름으로 추측 할 수 있음) 네트워크 카드로 다시 추적 할 수 있습니다. 이것을 만드는 것은 권장하지 않습니다.
버전 4 : 이들은 임의의 (또는 의사 난수) 숫자로 생성됩니다. UUID를 생성하기 만하면 원하는 것입니다.
주어진 이름에서 항상 동일한 UUID를 생성해야하는 경우 버전 3 또는 버전 5가 필요합니다.
버전 3 : 네임 스페이스 및 이름의 MD5 해시에서 고유 ID를 생성합니다. 이전 버전과의 호환성 (이름에서 UUID를 생성하는 다른 시스템과의 호환성)이 필요한 경우이를 사용하십시오.
버전 5 : 네임 스페이스 및 이름의 SHA-1 해시에서 고유 ID를 생성합니다. 이것은 선호하는 버전입니다.
reproducible
주어진 이름에서 UUID 를 생성해야하는 경우 버전 3 또는 버전 5가 필요합니다. 해당 알고리즘에 동일한 입력을 제공하면 동일한 출력을 생성합니다.
난수를 원하면 난수 라이브러리를 사용하십시오. 효과적으로 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)
set_size
2 ^ 122임을 기억하십시오 .
그것은 매우 일반적인 질문입니다. 한 가지 대답은 "어떤 종류의 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를 생성 동일한 데이터). 이 속성은 일부 상황 (특히 콘텐츠 주소 지정 가능 스토리지 시나리오) 에서 매우 유용 할 수 있지만 특정 상황에서는 그렇지 않을 수 있습니다.
NAMESPACE_URL
는 RFC-41226ba7b811-9dad-11d1-80b4-00c04fd430c8
30 페이지의 권장 사항에 따라 일반적으로와 동일한 UUID 입니다.
Postgres 설명서 는의 차이점을 설명합니다 UUID
. 그들 중 몇 가지 :
V3 :
uuid_generate_v3(namespace uuid, name text)
-이 함수는 지정된 입력 이름을 사용하여 지정된 네임 스페이스에서 버전 3 UUID를 생성합니다.
V4 :
uuid_generate_v4
-이 함수는 버전 4 UUID를 생성하며 이는 완전히 임의의 숫자에서 파생됩니다.