문제

GUID는 항상 고유합니까?

여러 스레드에서 고유하게 유지됩니까?

도움이 되었습니까?

해결책

생성된 각 GUID는 그렇지 않습니다. 고유함이 보장되는 총계 고유 키 수(2128 또는 3.4×1038)가 너무 커서 같은 숫자의 확률이 두 번 생성되는 것은 매우 작습니다.때문에 예를 들어, observable을 고려하십시오. 약 5×10을 포함하는 우주22별;그러면 모든 별은 6.8×1015 보편적으로 고유한 GUID.

에서 위키피디아.


다음은 GUID를 만드는 방법(.NET용)과 올바른 상황에서 동일한 GUID를 얻을 수 있는 방법에 대한 좋은 기사입니다.

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part- three/

​​

다른 팁

간단한 대답은 '예'입니다.

레이먼드 첸(Raymond Chen)은 다음과 같은 글을 썼습니다. 훌륭한 기사 GUID에 대해 그리고 GUID의 하위 문자열이 왜 ~ 아니다 독특함을 보장합니다.이 기사에서는 GUID가 생성되는 방식과 GUID가 고유성을 보장하기 위해 사용하는 데이터에 대해 어느 정도 자세히 설명합니다. 그들은 :-)

동일한 GUID 값이 두렵다면 그 중 두 개를 나란히 배치하십시오.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

너무 편집증적이라면 3개를 넣으세요.

참고로 저는 Windows XP에서 볼륨 GUID를 가지고 놀았습니다.이는 3개의 디스크와 14개의 볼륨으로 구성된 매우 모호한 파티션 레이아웃입니다.

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

GUID가 매우 유사하다는 것이 아니라 모든 GUID에 "mario"라는 문자열이 있다는 사실입니다.우연의 일치인가요, 아니면 이에 대한 설명이 있나요?

지금, 언제 4부 구글링 중 GUID에서 볼륨 GUID로 약 125,000개의 조회수를 발견했습니다.

결론: 볼륨 GUID의 경우 다른 GUID만큼 고유하지 않습니다.

예, GUID는 항상 고유해야 합니다.이는 하드웨어와 시간을 기반으로 하며 고유한지 확인하기 위해 몇 가지 추가 비트를 추가합니다.이론적으로는 두 개의 동일한 것으로 끝나는 것이 가능하다고 확신하지만 실제 시나리오에서는 거의 불가능합니다.

Guids에 대한 Raymond Chen의 훌륭한 기사는 다음과 같습니다.

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx ​ ​ ​

그런 일이 일어나서는 안 됩니다.그러나 .NET의 로드가 심한 경우 중복된 GUID를 얻을 수 있습니다.두 개의 서로 다른 SQL 서버를 사용하는 두 개의 서로 다른 웹 서버가 있습니다.데이터를 병합하러 갔더니 1,500만 개의 가이드와 7개의 중복 항목이 있는 것을 발견했습니다.

가이드는 통계적으로 고유합니다.두 개의 서로 다른 클라이언트가 동일한 Guid를 생성할 확률은 극히 작습니다(Guid 생성 코드에 버그가 없다고 가정).우주선으로 인한 프로세서 결함과 현재 2+2=5라고 결정하는 것에 대해 걱정할 수도 있습니다.

새 GUID를 할당하는 여러 스레드는 고유한 값을 얻지만 호출하는 함수가 스레드로부터 안전하다는 것을 알아야 합니다.이것은 어떤 환경에 있습니까?

Eric Lippert는 GUID에 관한 매우 흥미로운 일련의 기사를 작성했습니다.

2개의 주문이 있습니다30 전 세계의 개인용 컴퓨터(및 물론 많은 핸드헬드 장치 또는 PC가 아닌 컴퓨팅 장치가 있습니다. 거의 동일한 수준의 컴퓨팅 성능이지만 무시할 수 있습니다. 그것들).우리가 세계의 모든 PC를 GUID 생성 작업;각각이 2개를 생성할 수 있다면20 GUID당 두 번째, 약 2 후72 초 -- 백오십 1조 년 -- 당신은 매우 높다 생성 확률 특정 GUID와 충돌합니다.그리고 충돌의 확률은 불과 30조 년 만에 꽤 괜찮습니다.

이론적으로는 아니요, 고유하지 않습니다.동일한 GUID를 반복해서 생성하는 것이 가능합니다.그러나 그런 일이 일어날 확률은 너무 낮아서 그것이 독특하다고 가정할 수 있습니다.

이전에 서버가 자연적으로 연소되거나 코드의 다른 버그와 같은 다른 문제에 대해 스트레스를 받아야 할 가능성이 너무 낮다는 것을 읽었습니다.즉, 그것이 고유하다고 가정하고 중복을 "잡기" 위한 코드를 작성하지 마십시오. 발생할 가능성이 더 높은 일에 시간을 투자하십시오(예: 아무것 또 다른).

시도했다 내 블로그 독자(기술 지식이 없는 가족 구성원)에게 GUID의 유용성을 설명합니다.여기에서(Wikipedia를 통해) 중복 GUID가 생성될 확률은 다음과 같습니다.

  • 2^128 중 1
  • 1/340 undecillion (걱정하지 마세요. undecillion은 퀴즈)
  • 1/3.4 × 10^38
  • 340,000,000,000,000,000,000,000,000,000,000,000,000 중 1개

아무도 그것이 발생할 확률에 대한 실제 수학을 언급하지 않는 것 같습니다.

먼저 전체 128비트 공간을 사용할 수 있다고 가정해 보겠습니다(Guid v4는 122비트만 사용함).

우리는 n 추천은 다음과 같습니다

(1-1/2128)(1-2/2128)...(1-(n-1)/2128)

왜냐하면 2128 것보다 훨씬 더 크다 n, 이를 대략적으로 다음과 같이 계산할 수 있습니다.

(1-1/2128)n(n-1)/2

그리고 우리가 가정할 수 있기 때문에 n 0보다 훨씬 크면 다음과 같이 근사할 수 있습니다.

(1-1/2128)n^2/2

이제 이것을 "허용 가능한" 확률, 즉 1%와 동일시할 수 있습니다.

(1-1/2128)n^2/2 = 0.01

우리가 해결하는 것 n 그리고 얻다:

n = sqrt(2* 로그 0.01 / 로그(1-1/2128))

Wolfram Alpha는 어떤 사람이 될까요? 5.598318 × 1019

이 숫자를 관점에서 살펴보기 위해 각각 4코어 CPU가 있고 4Ghz를 수행하고 10000사이클을 사용하여 Guid를 생성하고 다른 작업을 수행하지 않는 10000대의 시스템을 가정해 보겠습니다.그런 다음 복제본을 생성하는 데 최대 111년이 걸립니다.

에서 http://www.guidgenerator.com/online-guid-generator.aspx

GUID란 무엇입니까?

GUID(또는 UUID)는 'Globally Unique Identifier'(또는 'Universally Unique Identifier')의 약어입니다.리소스를 식별하는 데 사용되는 128비트 정수입니다.GUID라는 용어는 일반적으로 Microsoft 기술을 사용하는 개발자가 사용하는 반면 UUID는 다른 모든 곳에서 사용됩니다.

GUID는 얼마나 고유합니까?

128비트는 충분히 크고 생성 알고리즘은 충분히 고유하여 초당 1,000,000,000개의 GUID가 1년 동안 생성된 경우 중복 확률은 50%에 불과합니다.또는 지구상의 모든 인간이 600,000,000개의 GUID를 생성했다면 중복될 확률은 50%에 불과합니다.

MSDN:

새 Guid의 값이 모두 0이거나 다른 Guid와 같을 확률은 매우 낮습니다.

시스템 시계가 올바르게 설정되어 있고 순환되지 않았으며 NIC에 자체 MAC이 있는 경우(예:사용자 정의 MAC을 설정하지 않았으며 NIC 공급업체가 MAC을 재활용하지 않았으며(할 수는 없지만 발생하는 것으로 알려진) 시스템의 GUID 생성 기능이 올바르게 구현되면 시스템이 중복 GUID를 생성하지 마십시오.

GUID를 생성하는 지구상의 모든 사람이 해당 규칙을 따르면 GUID는 전역적으로 고유하게 됩니다.

실제로 규칙을 위반하는 사람의 수는 적으며 해당 GUID는 "탈출"될 가능성이 없습니다.충돌은 통계적으로 불가능합니다.

중복된 GUID가 발생했습니다.

저는 Neat Receipts 데스크탑 스캐너를 사용하는데 독점 데이터베이스 소프트웨어가 함께 제공됩니다.소프트웨어에는 클라우드 동기화 기능이 있는데 동기화 시 계속 오류가 발생했습니다.로그를 살펴보면 다음과 같은 놀라운 내용이 드러났습니다.

"오류":[{"코드":1,"메시지":"creator_guid:이(가) 이미 taken","guid":"C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

나는 약간의 불신을 느꼈지만 확실히 충분했습니다. 내 로컬 깔끔한 데이터베이스에 대한 방법을 찾아 해당 GUID가 포함된 레코드를 삭제했을 때 오류 발생이 중단되었습니다.

따라서 일화적인 증거로 귀하의 질문에 대답하려면 아니요.중복이 가능합니다.하지만 그 일이 일어난 이유는 우연이 아니라 표준 관행이 어떤 방식으로든 준수되지 않았기 때문일 가능성이 높습니다.(저는 그다지 운이 좋지는 않습니다.) 그러나 확실하게 말할 수는 없습니다.내 소프트웨어가 아닙니다.

그들의 고객 지원은 매우 정중하고 도움이 되었지만 3시간 이상 전화 통화를 한 후에도 해결책을 찾지 못했기 때문에 이전에는 이 문제를 접한 적이 없었을 것입니다.(FWIW, 저는 Neat에 매우 깊은 인상을 받았습니다. 이 결함이 아무리 실망스럽더라도 해당 제품에 대한 제 의견은 바뀌지 않았습니다.)

GUID는 항상 고유합니까?

생성하는 방법에는 여러 가지가 있으므로 보장되지 않습니다.그러나 동일한 두 개의 GUID를 생성할 가능성을 계산해 보면 다음과 같은 아이디어를 얻을 수 있습니다.GUID는 128비트이므로 2개가 있습니다.128 고유한 GUID – 많이 알려진 우주에 있는 별의 수보다 더 많은 것입니다.읽기 위키피디아 기사 상세 사항은.

GUID 알고리즘은 일반적으로 본질적으로 의사 무작위 문자열인 v4 GUID 사양에 따라 구현됩니다.안타깝게도 이들은 다음 범주에 속합니다. "고유하지 않을 가능성이 높음", Wikipedia에서 (왜 그렇게 많은 사람들이 이 부분을 무시하는지 모르겠습니다):"...다른 GUID 버전은 보장된 고유성부터 비고유성까지 다양한 고유성 속성과 확률을 갖습니다."

V8 JavaScript의 의사 무작위 속성 Math.random() 충돌은 종종 수천 번만 반복한 후에 발생하는 고유성 때문에 끔찍하지만 V8이 유일한 원인은 아닙니다.저는 v4 GUID의 PHP 및 Ruby 구현을 모두 사용하여 실제 GUID 충돌을 보았습니다.

여러 클라이언트와 서버 클러스터에 걸쳐 ID 생성을 확장하는 것이 점점 더 일반화되고 있기 때문에 엔트로피는 큰 타격을 입습니다. ID를 생성하는 데 동일한 무작위 시드가 사용될 가능성이 높아집니다(시간은 종종 무작위 시드로 사용됩니다). 의사 난수 생성기에서) GUID 충돌은 "고유하지 않을 가능성이 높음"에서 "많은 문제를 일으킬 가능성이 매우 높음"으로 확대됩니다.

이 문제를 해결하기 위해 저는 안전하게 확장할 수 있고 충돌에 대해 더 나은 보장을 제공할 수 있는 ID 알고리즘을 만들기 시작했습니다.이는 타임스탬프, 메모리 내 클라이언트 카운터, 클라이언트 지문 및 임의 문자를 사용하여 수행됩니다.요소의 조합은 여러 호스트에 걸쳐 확장하더라도 특히 충돌에 강한 추가적인 복잡성을 생성합니다.

http://usecuid.org/

다중 스레드/다중 프로세스 단위 테스트 중에도 GUID가 고유하지 않은 것을 경험했습니다.나는 그것이 다른 모든 사항이 동일하다면 의사 난수 생성기의 동일한 시드(또는 시드 부족)와 관련이 있다고 생각합니다.고유한 파일 이름을 생성하는 데 사용하고 있었습니다.나는 OS가 그 일을 훨씬 더 잘한다는 것을 알았습니다 :)

트롤링 경고

GUID가 100% 고유한지 묻습니다.이는 고유해야 하는 GUID 수에 따라 다릅니다.GUID 수가 무한대에 가까워질수록 GUID가 중복될 확률은 100%에 가까워집니다.

보다 일반적인 의미에서 이것은 "생일 문제" 또는 "생일 역설"로 알려져 있습니다.Wikipedia에는 ​​다음 위치에 꽤 좋은 개요가 있습니다.Wikipedia - 생일 문제

매우 대략적으로 말하면 풀 크기의 제곱근은 중복 가능성이 50%라고 예상할 수 있는 대략적인 근사치입니다.이 기사에는 2^128에 대한 행을 포함하여 풀 크기와 다양한 확률에 대한 확률 테이블이 포함되어 있습니다.따라서 1% 충돌 확률의 경우 2.6*10^18 128비트 숫자를 무작위로 선택해야 합니다.50% 확률은 2.2*10^19 선택이 필요한 반면, SQRT(2^128)는 1.8*10^19입니다.

물론 이는 진정한 무작위 프로세스의 이상적인 경우일 뿐입니다.다른 사람들이 언급했듯이 많은 사람들이 그것을 타고 있습니다. 무작위의 측면 - 생성기와 시드가 얼마나 좋은가요?모든 것이 스푸핑되거나 가상화될 수 있다는 점을 제외하면 더욱 완벽하게 이 프로세스를 지원하는 하드웨어 지원이 있다면 좋을 것입니다.이것이 MAC 주소/타임스탬프가 더 이상 통합되지 않는 이유일 수 있다고 생각합니다.

의 답변 "GUID는 100% 고유합니까?" 단순히 "아니요" .

  • GUID의 100% 고유성을 원한다면 다음을 수행하십시오.

    1. GUID 생성
    2. 해당 GUID가 고유성을 찾고 있는 테이블 열에 존재하는지 확인하십시오.
    3. 존재하는 경우 1단계로 이동하고 그렇지 않으면 4단계로 이동합니다.
    4. 이 GUID를 고유하게 사용하십시오.

가장 어려운 부분은 중복된 Guid를 생성하는 것이 아닙니다.

가장 어려운 부분은 생성된 것을 모두 저장하여 실제로 중복되었는지 확인할 수 있는 데이터베이스를 설계하는 것입니다.

위키에서:

예를 들어, 적어도 한 번의 충돌이 50% 확률로 발생하기 위해 생성해야 하는 무작위 버전 4 UUID의 수는 2.71경이며 다음과 같이 계산됩니다.

여기에 이미지 설명을 입력하세요

이 숫자는 약 85년 동안 초당 10억 개의 UUID를 생성하는 것과 동일하며, 이 많은 UUID를 포함하는 파일(UUID당 16바이트)은 약 45엑사바이트에 달하며, 이는 현재 존재하는 가장 큰 데이터베이스보다 몇 배 더 큽니다. 수백 페타바이트 정도

GUID는 글로벌 고유 식별자(Global Unique Identifier)를 나타냅니다.

간단히 말해서:(단서는 이름에 있습니다)

상세히:GUID는 고유하도록 설계되었습니다.이는 컴퓨터 시계와 컴퓨터 자체를 기반으로 하는 무작위 방법을 사용하여 계산됩니다. 동일한 시스템에서 동일한 밀리초에 많은 GUID를 생성하는 경우 일치할 가능성이 있지만 거의 모든 일반 작업에서는 고유한 것으로 간주되어야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top