GUID가 항상 고유하다고 가정하는 것이 안전합니까?


123

충돌 가능성이 약간 있음을 알고 있지만 1000 개의 GUID (예 :)의 일괄 처리를 생성 한 경우 각각 테스트를 저장하는 것이 모두 고유하다고 가정하는 것이 안전할까요?

보너스 질문

GUID의 고유성을 테스트하는 최적의 방법은 무엇입니까? 블룸 필터일까요?



29
하지 않으면 우리는이 사이트에 다시로드 버튼을 매쉬업 모든 킵 : wasteaguid.info
mipadi

12
GUID 충돌에 대한 모든 버그를 비난합니다. 시간이 좀 걸리지 않나요?
Michael

8
사랑스러운 격자 무늬의 색상을 가진 상어가 하늘에서 떨어져 컴퓨터를 깨뜨릴 가능성이 훨씬 더 높으므로 이에 대한 예방 조치를 취하는 것이 전반적인 위험 감소의 일환으로 리소스를 더 적절하게 할당하는 것이라고 제출하겠습니다. 계획.
David Gladfelter 2010-06-04

4
@mipadi : 훌륭한 링크! 어딘가에서 "Guuuuys! GUID를 낭비하지 마세요! 필요 합니다!"
FrustratedWithFormsDesigner

답변:


360

그래 넌 할수있어. GUID의 길이는 128 비트이므로 충돌이 발생할 가능성은 몇 분이지만 "분"이라는 단어는 충분히 강하지 않습니다. GUID너무 많아서 무작위로 수조 개 를 생성 하면 한 번의 충돌도 발생하는 것보다 운석에 맞을 가능성이 더 높습니다 ( Wikipedia ). 그리고 당신은 무작위로 생성되지 않지만, 경우 MAC 주소는 컴퓨터와 타임 스탬프들 고유의 고유 한대로 그들은 또한, 고유 겁니다는 MAC 주소 - 및 - 타임 스탬프 알고리즘을 사용 하여 컴퓨터.

편집 1 : 보너스 질문에 답하기 위해 GUID 세트의 고유성을 테스트하는 최적의 방법은 모두 고유하다고 가정하는 것입니다. 왜? 생성하는 GUID의 수를 감안할 때 GUID 충돌 확률은 컴퓨터 메모리에서 우주 광선이 약간 뒤집히고 원하는 "정확한"알고리즘이 제공하는 답을 망칠 확률보다 작기 때문입니다. 실행합니다. ( 수학에 대해서는 이 StackOverflow 답변 을 참조하십시오 .)

거기에는 엄청난 수의 GUID가 있습니다. 더글러스 아담스의 은하계에 대한 히치하이커 가이드 를 인용하려면 :

"공간"은 "크다. 정말 큽니다. 얼마나 엄청나게 큰지 믿기지 않을 것입니다. 화학자에게가는 길이 멀다고 생각할 수도 있습니다.하지만 그것은 우주로가는 땅콩입니다." , 들어 봐… "

이 때문에 그리고 7 × (10)에 대해 22 우주의 별 , 그리고 바로 아래 2 128 GUID를, 다음 4.86 × 10 정도가 15 - 지하 오 천조의 모든 단일 스타 -GUIDs는. 그 별들 모두가 우리처럼 번성하는 인구를 가진 세계를 가지고 있다면, 모든 별 주위에서 살았던 모든 인간이나 외계인은 4 만 5 천 개 이상의 GUID를받을 자격이있을 것입니다. 우주의 모든 별의 역사상 모든 사람을 위해. GUID 공간은 전체 우주의 크기와 동일한 수준입니다. 당신은 할 수 없습니다 걱정할 필요.

( 편집 2 : 이것에 대해 반성 : 와우. 나는 이것이 무엇을 의미하는지 스스로 깨닫지 못했습니다 . GUID 공간은 이해할 수 없을 정도로 방대합니다. 나는 약간 경외심을 느낍니다.)


1
또한 WolframAlpha는 지금까지 살았던 모든 사람의 모든 세포에 36 조 UUID가 있다고보고합니다. 당신은에 대해이 10^14몸의 세포 및 1천65억명 지금까지 살아왔다. 또는 2.385 * 10^23미국 공공 부채의 1 센트 당 UUID.
new123456

5
숫자는 여전히 높지만 GUID 충돌 가능성은 2 ^ 64 GUID에서 50 % 이상입니다.
NullUserException

1
2 ^ 64 GUID에서 이것은 우주에서 별당 1 개 (0.00026) 미만으로 숫자를 줄이고 모든 인간 또는 외계인에 대해 2 * 10 ^ (-15)를 줄입니다. 이것은 지금까지 살았던 모든 인간 에게 1 억 7 천만 이상의 GUID를 허용 할 것이므로 우리는 여전히 좋다고 생각합니다.
NullUserException 2010 년

12
GUID 충돌은 동일한 비즈니스 공간에있는 경우에만 문제가됩니다. 소프트웨어에서 구성 요소를 식별하는 데 사용하는 GUID는 문제를 일으키지 않고 응용 프로그램의 데이터베이스 행에서 사용하는 GUID와 동일 할 수 있습니다.
James Thorpe

1
2 ^ 128 개의 GUIDS가 있다는 사실은 무관하며 충돌 확률이 50 % 일 때 "아직 잘"하지 못하고 0.0000001 %도 잘하지 못합니다
BlackTigerX

40

짧은 대답 : 예, 실용적인 목적입니다.

그러나 생일 역설을 고려해야합니다!

몇 가지 대표적인 충돌 확률을 계산했습니다. Wikipedia 기사에 지정된대로 122 비트 UUID를 사용 하는 경우 2.71492e18UUID 를 최소한 생성하면 충돌 확률은 1/2 입니다. 10 ^ 19 UUID에서 확률은 0.999918입니다. 10 ^ 17 UUID 사용시 0.000939953.

비교를위한 일부 숫자는 Wikipedia에서 찾을 수 있습니다. 따라서 살았던 각 인간, 관측 가능한 우주의 각 은하, 바다의 각 물고기, 지구상의 각 개미에 대해 UUID를 안전하게 할당 할 수 있습니다. 그러나 인류가 1 년 동안 생성하는 각 트랜지스터, 지구상의 각 곤충, 지구상의 각 모래 알갱이, 관측 가능한 우주의 각 별 또는 더 큰 모든 것에 대해 UUID를 생성하면 충돌이 거의 확실합니다.

초당 10 억 UUID를 생성하면 약 36 년이 걸립니다. 10 %의 충돌 확률을 얻는 .

결국 인류 역사 과정에서 생성 된 일련의 UUID간에 충돌이있을 것입니다. 그래도 충돌 된 UUID가 같은 목적으로 사용될 확률은 매우 적기 때문에 실제로는 문제가 없습니다.


13
이것이 우주가 끝나는 방식입니다 ... 일부 프로그래머는 GUID가 메가 데스 스타에 대해 항상 고유하다고 가정합니다 ...
pkr298

UUID는 무작위가 아닌 데이터를 기반으로하기 때문에 36 년은 각 밀리 초에 대해 개별적으로 만 걱정하면됩니다.
mjaggard

@mjaggard UUID는 무작위 데이터를 기반으로합니다. 어쨌든 현대적인 종류.
Trejkaz 19

8

충돌 가능성에 대한 분석은 Wikipedia에서 확인할 수 있습니다. http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

링크에서 언급했듯이 이것은 난수 생성기의 속성에 영향을받습니다.

GUID 생성기 코드에 버그가있을 가능성도 있습니다. 가능성은 낮지 만 수학에 근거한 충돌 가능성보다 높을 것입니다.

Bloom 필터가 적절할 수 있습니다. GUID가 고유한지 신속하게 알려줄 수 있지만 충돌을 잘못 표시 할 가능성이 있습니다. 한 번에 배치를 테스트하는 경우 다른 방법은 배치를 정렬하고 각 연속 요소를 비교하는 것입니다.


5

일반적으로 그렇다고 가정하는 것이 안전합니다.

GUID 생성기가 실제로 무작위 인 경우 1000 개의 GUID 내에서 충돌 가능성이 매우 적습니다.

물론 그것은 좋은 GUID 생성기를 가정합니다. 그래서 질문은 실제로 GUID를 생성하는 데 사용하는 도구를 얼마나 신뢰하고 자체 테스트가 있습니까?


0

충돌이 가능하지만 가능성은 거의 없습니다. ( 여기에서 수학 .) 그것들이 실제로 구별된다고 가정하는 것이 안전합니다.


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