GUID가 100 % 고유한가요?


519

GUID가 100 % 고유한가요?

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


264
아니요, 100 % 아님 ... 99,999999999999999999999999999999999999999999999999999999999999999999999999999;;
JohannesH

52
우선, GUID는 무한하지 않습니다. 즉, "100 %의 시간"이라는 문자 적 ​​의미에서 GUID를 얼마나 오래 생성하더라도 항상 고유 할 것입니다. 그렇지 않다. 또한 네트워크 카드 고유의 serial / id / MAC를 사용하여 키의 일부를 생성하는 원래 구현이 더 이상 사용되지 않으므로 다양한 이유로 GUID가 더 이상 전 세계적으로 고유 하지 않습니다 . 그러나 로컬에서 고유합니다. 즉, 단일 시스템에서 GUID를 계속 생성하면 중복이 발생하지 않습니다.
Lasse V. Karlsen 2016 년

36
@ojrac 난 그냥 반올림하기로 결정 ... : P
JohannesH

403
GUID를 생성 할 때마다 나는 우주에서 하나를 훔치는 것처럼 느낍니다. 때때로 나는 필요한 것보다 훨씬 더 많은 GUID를 생성하는 악한 사람들에 대해 생각하고 낭비되는 GUID는 너무 외로워서 사용되거나 다시 생성되지 않습니다 ...
asavartsov

29
@asavartsov 나는 당신이 wasteaguid.info ^ _ ^을 좋아할 것이라고 생각합니다 ^ _ ^
Navin

답변:


431

생성 된 각 GUID가 고유 한 것은 아니지만 총 고유 키 수 ( 2128 또는 3.4 × 10 38 )는 너무 커서 같은 수의 두 번 생성 될 확률이 매우 작습니다. 예를 들어, 약 5 × 10 22 개의 별 을 포함하는 관측 가능한 우주를 고려하십시오 . 모든 별은 6.8 × 10 15 개의 보편적으로 독특한 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/

​​


115
그렇다면 UUID라고하지 않습니까? ;)
Arafangion

28
GUID는 Microsoft의 UUID 표준 구현입니다. 그래서 둘 다입니다. 세계적으로 고유 한 ID 대 세계적으로 고유 한 ID.
Adam Davis

40
v4 GUID에서는 16 진수가 항상 4 (효과적으로 4 비트 제거)가되고 2 비트가 더 남아 있기 때문에 2 ^ 128이 아닙니다. 그러나 2 ^ 122 유효한 V4 GUID는 여전히 5x10 ^ 36 정도 남습니다. 그리고 당신도. 각 별은 각각 약 1.1x10 ^ 14 GUID를 수용해야합니다.
Andrew Shelansky

67
당신이 나와 같다면, 당신은 2^128쓰여진 것이 대략 다음과 같은 것을 알고 싶을 것입니다 34,028,236,692,093,846,346,337,460,743,177,000,000. 통계적으로 초당 1000 개의 GUID를 계산 한 경우 복제본을 얻는 데 여전히 수조 년이 걸립니다.
엔티티

26
나는 그것을 읽는 것이 재미있어서 여기에 재미있는 사람이 있다고 생각했다. : 4 백 육십 칠백 칠십 삼십 억 칠십 칠만
hjavaher

85

동일한 GUID 값이 무서워지면 두 값을 서로 옆에 두십시오.

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

편집증이 너무 심하면 3을 넣으십시오.


64
3 개의 GUID를 추가하려면 매우 편집증이어야합니다.
harsimranb

25
@harsimranb 아니요 ... 아주 매우, 매우 편집증은 6 GUID입니다. 편집증은 하나 추가, 매우 편집증은 두 추가 등
Suamere

37
@Suamere 나는 당신의 편집증 수준 계산하는 웹 사이트를 만들었습니다 jogge.github.io/HowParanoidAmI
Jogge

3
@Jogge xD 정말 놀랍습니다. 999999999귀하의 양식에 9 9를 입력 한 후에 는 편집증이 내 브라우저를 무너 뜨릴 것이라고 생각합니다.
Suamere

66

간단한 대답은 그렇습니다.

Raymond Chen은 GUID와 GUID의 하위 문자열이 고유 하지 않은 이유에 대한 훌륭한 기사 를 썼습니다 . 이 기사는 설명에 약간의 길이로 가야한다 그들이 고유성을 보장하기 위해 사용하는 GUID를 생성하는 방법과 데이터에 일부 깊이에가는 이유 가 있습니다 :-)


23
Chen의 기사는 MAC 주소 및 타임 스탬프를 사용하는 GUID 생성 알고리즘의 V1을 참조한다고 생각합니다. 현재 V4는 의사 난수를 대신 사용합니다. en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm
Barrett

2
링크가 죽었 - 403 금지
다야


39

부수적으로, 나는 Windows XP에서 Volume 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"라는 문자열이 있다는 사실입니다. 우연의 일치입니까, 아니면 그 뒤에 설명이 있습니까?

이제 GUID에서 파트 4검색 할 때 볼륨 GUID로 약 125.000 개의 히트를 발견했습니다.

결론 : Volume GUID와 관련하여 다른 GUID만큼 고유하지 않습니다.


31
80 년대의 Super Mario Bros 3 광고를 기억하십니까? "마리오! 마리오! 마리오!" 전 세계에서 우주의 무작위성이 약간 화나게되었습니다.
MGOwen

24
로 Office 2010을 수동으로 제거 msiexec하면 Office 프로그램의 모든 MSI GUID가 나열됩니다. 그들은 모두 철자를 쓴다 0FF1CE. 마이크로 소프트가 GUID를 생성하는 방법에 대해 상당히 느슨하게 해석 한 것처럼 보인다;)
Mark Henderson

3
이 파티션 GUID는 모두 2009-12-17 @ 2:47:45 UTC로 함께 만들어졌습니다. 그것들은 여러분의 컴퓨터에 고유하지만, 노드 식별자가 잘못되어 "mario"를 넣는 것은 RFC-4122를 준수하지 않음을 의미합니다. 마찬가지로 0FF1CEGUID는 RFC-4122의 "NCS 이전 버전과의 호환성"섹션에 속하지만 Microsoft가 해당 값에 대한 NCS 규칙을 따르지 않을 가능성이 큽니다.
Stephen Cleary

16
나는 Nintendo Security Administration이 난수 생성기를 손상 시켰습니다.
MetaGuru

1
어쩌면 그것은 광천수를 만드는 회사의 이름 (시장을 이끌었다 고 들었음) Evian과 같은 구장 일 것입니다. 철자 뒤쪽으로는 :-) 나이브 제공
MARIUSZ

31

일어나서는 안됩니다. 그러나 .NET에 과부하가 걸리면 중복 guid를 얻을 수 있습니다. 두 개의 다른 SQL 서버를 사용하는 두 개의 다른 웹 서버가 있습니다. 데이터를 병합하려고했는데 1,500 만 개의 guid와 7 개의 복제본이있는 것으로 나타났습니다.


1
두 대의 컴퓨터에서 어떻게 가능합니까? GUID의 일부가 컴퓨터 이름이라고 생각 했습니까? (논쟁하지 않고 ... 그냥 묻는)
존 크루즈

8
이것은 GUID 생성의 일부로 MAC 주소 (시스템 이름이 아님)를 사용하는 v1 guid에만 해당됩니다. 사실상 STD 인 v4는 더 이상 Mac 주소를 사용하지 않고 의사 난수를 사용합니다.
Xander

14
Guid.NewGuid항상 v4 GUID를 생성합니다 (항상 가지고 있음). 팀은 엔트로피 소스가 극도로 좋지 않았을 것입니다.
Stephen Cleary

1
그것은 복제 된 적이 있습니까? 그렇다면 큰 문제입니다.
Zyo

1
매우 큰 데이터 세트를 가져 오는 동안 동일합니다. 약 10-100 만에서 Guid.NewGuid
Stephan Baltzer

28

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

다음은 Guids에 대한 Raymond Chen의 훌륭한 기사입니다.

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


5
이 기사는 다소 구식이며 GUID v1을 참조합니다. v4는 하드웨어 / 시간 대신 난수 알고리즘을 사용합니다. en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mani Gandham

이 링크가 깨졌습니다
Marcel


23

길드는 통계적으로 독특합니다. 동일한 Guid를 생성하는 서로 다른 두 클라이언트의 가능성은 무한히 작습니다 (Guid 생성 코드에 버그가 없다고 가정). 우주 광선으로 인해 프로세서 글리치가 발생하고 오늘날 2 + 2 = 5로 결정하는 것에 대해 걱정할 수도 있습니다.

새 guid를 할당하는 여러 스레드는 고유 한 값을 갖지만 호출하는 함수는 스레드로부터 안전해야합니다. 어떤 환경입니까?


19

Eric Lippert는 GUID에 관한 매우 흥미로운 기사 시리즈를 작성했습니다.

이 순서 2에있는 30 세계 개인용 컴퓨터 (및 휴대용 장치 또는 컴퓨팅 파워의 더 많거나 적은 같은 수준이 컴퓨팅 디바이스가 아닌 PC의 과정 많이 있지만, 그 무시 할 수 있습니다). 세계의 모든 PC를 GUID 생성 작업에 넣었다고 가정 해 봅시다. 하나 하나가 생성 할 수있는 경우,이 말 (20) 두 번째 다음 시간 이후에 단지 2에 대한 당 GUID를 72 - 초 백오십조년 - 당신이해야합니다 매우 높은 특정의 GUID와의 충돌을 생성하는 기회를. 그리고 충돌 가능성은 30 조 년만에 아주 좋아집니다.


28
... 그리고 그는 다음 단락에서 계속합니다 : "그러나 그것은 특정 GUID와의 충돌을 찾고 있습니다. [...] 따라서 만약 우리가이 10 억 대의 PC를 1212 비트의 임의의 GUID를 생성하도록한다면, 약 2 ^ 61 개의 GUID가 생성 된 후 그 중 2 개 지점에서 충돌이 실제로 높아질 것입니다. 우리는 약 2 ^ 30 대의 기계가 초당 2 ^ 20 개의 GUID를 수행한다고 가정하기 때문에 약 2 ^ 후에 충돌이 예상됩니다. 11 초인데 약 1 시간 입니다. " (그리고 마침내 그는 많은 GUID가 생성되는 것은 아니라고 설명합니다.)
Arjan

16

이론적으로, 그들은 독특하지 않습니다. 동일한 guid를 반복해서 생성 할 수 있습니다. 그러나 발생 가능성은 너무 낮아서 고유하다고 가정 할 수 있습니다.

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

나는 시도했다 내 블로그 독자 (비 기술적 인 가족 멤버들)에 GUID가의 유용성을 설명하기를. 거기에서 (Wikipedia를 통해) 중복 GUID를 생성 할 확률은 다음과 같습니다.

  • 2 ^ 128 중 1
  • 340에서 1 undecillion (걱정하지 마십시오, undecillion은 퀴즈에 없습니다)
  • 3.4 × 10 ^ 38에서 1
  • 340,000,000,000,000,000,000,000,000,000,000,000,000 중 1

1
사실, 나는 다른 입장에서 '걱정하지 않는다'는 것에 동의하지 않습니다. GUID 충돌을 감지하면 응용 프로그램에 문제가 있습니다. 예를 들어, dem 등성 (imdempotency)을 위해 GUID를 사용했으며 명령이 같은 GUID로 두 번 전송되면 충돌이 발생했습니다.
Kenny Hung

9

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

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

n픽 에서 중복을 얻지 않을 확률 은 다음과 같습니다.

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

2 128 이보다 훨씬 크기 때문에 다음 n과 같이 근사 할 수 있습니다.

(1-1 / 2 128 ) n (n-1) / 2

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

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

이제 이것을 "허용 가능한"확률과 동일시 할 수 있습니다. 1 %라고합시다.

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

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

n = sqrt (2 * log 0.01 / log (1-1 / 2 128 ))

Wolfram Alpha는 5.598318 × 10 19가됩니다.

이 숫자를 원근법으로 나타내려면 각각 4 개의 코어 CPU가 있고 4Ghz를 수행하고 10000주기를 사용하여 Guid를 생성하고 다른 작업을 수행하지 않는 10000 대의 시스템을 사용하십시오. 그런 다음 복제본을 생성하는 데 ~ 111 년이 걸립니다.


이 게시물에 따라 게시물을 수정했습니다 . 실수를 한 경우 수정 해주세요;).
shA.t

안녕하세요 @Cine, 귀하의 답변을 편집 할 수있는 권한이 있지만, 귀하가 먼저 반박 할 기회를 갖기를 원치 않기 때문에 선택하지 않았습니다. 당신에게서 들리지 않습니다. 그래도 수학이 틀렸다고 확신합니다. 1 % 확률을 결정하기위한 실제 방정식은 다음과 같습니다 : ((2 ^ 128-1) / 2 ^ 128) ^ ((n (n-1)) / 2) = .01. 지수가 잘못되었습니다. 그것은 단지 n이 아닙니다. "n"guid를 생성 할 때 모든 조합을 계산하려면 C (n, 2) (일명 (n * (n-1)) / 2)가 필요합니다. 자세한 내용은 여기를 참조하십시오
viggity

감사합니다 씨네, 너무 너무 큰 이후 ^ 2/2 근사치로 끝났다 :)
viggity

가능한 모든 단일 GUID를 생성 한 다음 복제본을 생성하는 데 111 년의 기계가 111 년이 걸렸습니다. 그러나 가능한 모든 GUID가 생성되기 훨씬 전에 복제가 발생합니다. 대략적인 시간은 GUID 생성 프로세스가 '무작위'인지에 달려 있다고 생각합니다.
George K

@GeorgeK 당신이 오해 한 것 같아요. 1 %의 확률로 복제품을 발견하려면 111 년에 10000 대의 기계가 필요합니다. 그러나 그렇습니다.이 수학은 랜덤 생성기가 완전히 랜덤이라고 가정합니다.
Cine

7

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

GUID 란 무엇입니까?

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

GUID는 얼마나 독특합니까?

128 비트는 충분히 크고 생성 알고리즘은 1 년 동안 초당 1,000,000,000 GUID가 생성 된 경우 복제 가능성이 50 %에 불과할 정도로 독특합니다. 또는 지구상의 모든 사람이 600,000,000 개의 GUID를 생성하면 복제 확률은 50 %에 불과합니다.


7
50 %의 확률로 두려움을 일으킬 정도로 높지 않습니까?
disklosr

1
@disklosr 그렇습니다. 만약 여러분의 시스템이 초당 10 억 GUID를 생성한다면 두려움을 일으키기에 충분합니다. 극히 드물게 그 금액을 생성 한 다음 두 GUID를 연결하기
만하면

5

중복 된 GUID를 경험했습니다.

Neat Receipts 데스크탑 스캐너를 사용하며 독점 데이터베이스 소프트웨어와 함께 제공됩니다. 소프트웨어에는 클라우드와 동기화 기능이 있으며 동기화시 계속 오류가 발생합니다. 통나무를 살펴보면 멋진 행이 드러났습니다.

"오류": [{ "code": 1, "message": "creator_guid : 이미 작성되었습니다", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

나는 약간의 불신에 빠져 있었지만, 확실히 로컬 neatworks 데이터베이스에 대한 길을 발견하고 해당 GUID를 포함하는 레코드를 삭제하면 오류가 발생하지 않았습니다.

따라서 일화적인 증거로 귀하의 질문에 대답하십시오. 복제가 가능합니다. 그러나 그것이 일어난 이유는 우연이 아니라 표준 관행이 어떤 식 으로든 준수되지 않았기 때문일 수 있습니다. (난 그냥 운이 아니에요) 그러나 나는 확실히 말할 수 없습니다. 내 소프트웨어가 아닙니다.

그들의 고객 지원은 매우 정중하고 도움이되었지만 3 시간 이상 전화를 걸어도 해결책을 찾지 못했기 때문에이 문제가 발생하지 않았어야합니다. (FWIW, 나는 Neat에게 깊은 인상을 받았으며,이 결함은 실망 스럽지만 제품에 대한 나의 의견을 바꾸지 않았습니다.)


19
복제본이 있다고 믿지 마십시오. 번호가 동기화 프로세스에서 실제로 임의적이 아니거나 문제가 아니거나 시스템이 두 번 기록하려고하는 등의 다른 문제가있을 수 있습니다. 소프트웨어 문제는 GUID가 중복되는 것보다 훨씬 가능성이 높습니다.
orad


4

시스템 시계가 올바르게 설정되어 있고 랩핑되지 않았고 NIC에 고유 한 MAC이있는 경우 (예 : 사용자 정의 MAC을 설정하지 않은 경우) NIC 공급 업체가 MAC을 재활용하지 않은 경우 (그렇지 않아야 함) 그러나 시스템의 GUID 생성 기능이 올바르게 구현되면 시스템은 중복 GUID를 생성하지 않습니다.

GUID를 생성하는 지구상의 모든 사람이 해당 규칙을 따르는 경우 GUID는 전 세계적으로 고유합니다.

실제로, 규칙을 어기는 사람들의 수가 적으며 GUID가 "탈출"되지 않을 것입니다. 충돌은 통계적으로 불가능합니다.


11
이것은 v1 guid에만 해당됩니다. 사실상 STD 인 v4는 더 이상 Mac 주소를 사용하지 않고 의사 난수를 사용합니다.
Pita.O

1
"그런 다음 시스템은 중복 GUID를 생성하지 않습니다."v1 guid에 대해 모든 규칙을 준수하더라도 시스템에서 여전히 중복을 생성 할 수 있습니다. "충돌은 통계적으로 불가능합니다."라고 말하면 더 정확합니다.
Nick Meldrum

3

GUID가 100 % 고유한가요?

여러 가지 방법으로 생성 할 수 있으므로 보장되지 않습니다. 그러나 동일한 두 개의 GUID를 생성 할 가능성을 계산하려고 시도하면 아이디어를 얻을 수 있습니다. GUID에는 128 비트가 있으므로 알려진 유니버스에 별보다 훨씬 많은 2 개의 128 개의 GUID 가 있습니다. 자세한 내용 은 Wikipedia 기사 를 읽으십시오 .


2

보다 일반적인 의미에서 이것은 "생일 문제"또는 "생일 역설"로 알려져 있습니다. Wikipedia의 개요는 다음과 같습니다. Wikipedia-Birthday Problem

매우 대략적인 용어로, 수영장 크기의 제곱근은 50 %의 복제 확률을 기대할 수있는 대략적인 근사치입니다. 이 기사에는 2 ^ 128의 행을 포함하여 풀 크기의 확률 테이블과 다양한 확률이 포함됩니다. 따라서 1 %의 확률로 2.6 * 10 ^ 18 128 비트 숫자를 임의로 선택할 것으로 예상됩니다. 50 % 확률은 2.2 * 10 ^ 19 픽을 요구하지만 SQRT (2 ^ 128)는 1.8 * 10 ^ 19입니다.

물론, 이것은 정말로 무작위 프로세스의 이상적인 경우입니다. 다른 사람들이 언급했듯이, 그 임의의 측면을 많이 타고 있습니다 -발전기와 씨앗이 얼마나 좋습니까? 이 프로세스를 지원하는 하드웨어 지원이 있다면 스푸핑이나 가상화가 가능한 것을 제외하고는 방탄 효과가 더 좋습니다. MAC 주소 / 타임 스탬프가 더 이상 통합되지 않은 이유 일 수 있습니다.


MAC 문제는 익명이라고 생각합니다. 되돌릴 수있는 방식으로 MAC 주소와 같은 식별자를 사용하는 것이 개인 정보 보호 문제라고 생각합니다. 나는 하드웨어에서 진정한 무작위가 매우 어렵다고 생각합니까? Cloudflare는 카메라와 일련의 용암 램프를 사용하지만 물리에 대한 정확한 이해가 있다고해도 무작위가 아니라고 생각합니다. Cloudflares 용암 램프 RNG : popularmechanics.com/technology/security/news/a28921/…
Jeff Block

2

더 나은 결과를 얻으려면 가장 좋은 방법은 타임 스탬프와 함께 GUID를 추가하는 것입니다 (독특하게 유지하기 위해)

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

같은 초에 두 번의 충돌이 발생하면 어떻게합니까?
Wai Ha Lee이

최악의 상황이지만 여전히 동일한 두 명의 Guid를 동시에 생성 할 수는 없습니다.
Adithya Sai

어딘가에서 그들은 질문에 대한 답변이 아니라 답변에 대한 답변에서 복사해야한다고 주장하지만 지금은 확실하지 않습니다 ....
Marcel

1

GUID 알고리즘은 일반적으로 의사 난수 문자열 인 v4 GUID 사양에 따라 구현됩니다. 슬프게도 이것들은 "고유하지 않은" 범주에 속합니다 은 Wikipedia의 하지 않을 (왜 많은 사람들이이 비트를 무시하는지 모르겠습니다). "고유하지 않을 가능성이 높습니다."

V8 JavaScript의 의사 난수 속성은 Math.random()독창적으로 끔찍하며 충돌은 종종 수천 번 반복 된 후에 발생하지만 V8이 유일한 범인은 아닙니다. v4 GUID의 PHP 및 Ruby 구현을 사용하여 실제 GUID 충돌을 보았습니다.

여러 클라이언트와 서버 클러스터에서 ID 생성을 확장하는 것이 점점 일반화되고 있기 때문에 엔트로피는 동일한 임의의 시드가 ID 에스컬레이션을 생성하는 데 사용될 가능성이 높습니다 (시간은 종종 임의의 시드로 사용됨) 의사 난수 발생기에서), GUID 충돌은 "고유하지 않을 것"에서 "많은 문제를 일으킬 수있는 것"으로 확대됩니다.

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

http://usecuid.org/


1

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

트롤링 경고

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


1

의 대답은 "GUID를 100 % 고유인가?" 단순히 "아니오"입니다 입니다.

  • GUID를 100 % 고유하게하려면 다음을 수행하십시오.

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

이것은 고유하지 않습니다. 알고리즘은 새로 생성 된 GUID를 테이블에 저장하지 않습니다. 다음에 GUID를 만들면 이전과 GUID가 충돌 할 수 있습니다. GUID를 테이블에 삽입하려는 경우, 다른 피어가 GUID를 이미 삽입했는지 사이에 고유성을 검사 한 후 GUID를 테이블에 삽입했을 수 있습니다. GUID는 시스템 내에서만 고유하므로 두 데이터베이스를 가져 오거나 병합하는 경우 여전히 충돌 할 수 있습니다. 또한 GUID는 중앙화 된 데이터베이스에 액세스 할 수없는 경우에 사용됩니다. 왜 데이터베이스에서 ID를 가져와야합니까?
Jogge

0

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

가장 어려운 부분은 실제로 복제되었는지 확인하기 위해 생성 된 모든 부분을 저장하는 데이터베이스입니다.

위키에서 :

예를 들어, 최소 하나의 충돌 가능성이 50 %가되도록 생성해야하는 임의 버전 4 UUID의 수는 2.71 퀴 틸리 온이며 다음과 같이 계산됩니다.

여기에 이미지 설명을 입력하십시오

이 숫자는 약 85 년 동안 초당 10 억 UUID를 생성하는 것과 같으며 UUID 당 16 바이트로이 많은 UUID를 포함하는 파일은 현재 존재하는 가장 큰 데이터베이스보다 몇 배 더 큰 약 45 엑사 바이트입니다. 수백 페타 바이트의 순서


0

GUID는 글로벌 고유 식별자를 나타냅니다

요약 : (단서는 이름에 있습니다)

자세히 : GUID는 고유하도록 설계되었습니다. 그들은 컴퓨터 시계와 컴퓨터 자체를 기반으로 임의의 방법을 사용하여 계산됩니다. 동일한 컴퓨터에서 동일한 밀리 초에 많은 GUID를 만드는 경우 일치 할 수 있지만 거의 모든 정상적인 작업에서는 고유 한 것으로 간주해야합니다.

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