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.