{{위키데이터 속성 추적}}
'''전역 고유 식별자'''(全域固有識別子, {{llang|en|Globally Unique Identifier, GUID}})는 [[응용 소프트웨어]]에서 사용되는 [[유사난수]]이다. GUID는 생성할 때 항상 유일한 값이 만들어진다는 보장은 없지만, 사용할 수 있는 모든 값의 수가 2<sup>128</sup> = 3.4028×10<sup>38</sup>개로 매우 크기 때문에, 적절한 [[알고리즘]]이 있다면 같은 숫자를 두 번 생성할 가능성은 매우 적다.

GUID는 [[오라클 DBMS|오라클]] [[데이터베이스]] 등 많은 곳에서 쓰이지만, 가장 눈에 띄는 구현은 아마도 [[마이크로소프트]]의 구현일 것이다. 표준으로는 [[오픈 소프트웨어 파운데이션]](Open Software Foundation, OSF)이 지정한 [[범용 고유 식별자]](Universally Unique Identifier, UUID)가 있다.

GUID는 '그위드'라 발음하는데, 이는 특히 마이크로소프트에 의해 사용된다. 다른 발음으로는 '구이드'가 있다.

== 기본 구조 ==
GUID는 16[[바이트]], 즉 128[[비트 (단위)|비트]] 숫자이다. [[16진수]]로 쓰면 다음과 같은 형태이다:

: <code>3F 25 04 E0 4F 89 11 D3 9A 0C 03 05 E8 2C 33 01</code>

특별히 규정된 텍스트 표현이 없기 때문에, GUID를 텍스트로 쓰는 방법은 구현에 따라 다를 수 있다. 많이 사용되는 표현 중 하나로 GUID를 순서대로 4바이트, 2바이트, 2바이트, 8바이트로 나눈 뒤 하이픈으로 구분하여 16진수로 작성하고 [[중괄호]]로 묶는 방법이 있다. 다음은 위의 GUID를 이 방법으로 표현한 것이다.

: <code>{3F2504E0-4F89-11D3-9A0C0305E82C3301}</code>

비슷하게, [[자료 구조]]로 사용할 때는 다음과 같은 형태가 가장 일반적이다.

{| class="wikitable"
! 시작 위치(비트) !! 끝 위치(비트) !! 형식 !! guiddef.h의 C 자료형<sup>[1]</sup>
|-
| 0 || 31 || 32비트 부호없는 정수 || unsigned long
|-
| 32 || 47 || 16비트 부호없는 정수 || unsigned short
|-
| 48 || 63 || 16비트 부호없는 정수 || unsigned short
|-
| 64 || 127 || 8비트 부호없는 정수 8개 || unsigned char[8]
|}
: <small>[1] [[C (프로그래밍 언어)|C]] 자료형은 [[컴파일러]]에 따라 크기가 다를 수 있다.</small>

== 알고리즘 ==
새로운 GUID를 생성하는 OSF의 알고리즘(V1 GUID)은 광범위한 비판을 받고 있다. 이 알고리즘은 GUID의 마지막 숫자 그룹을 생성할 때 사용자 [[네트워크 카드]]의 [[MAC 주소]]를 기반으로서 사용하기 때문에, 특정 문서를 작성한 [[컴퓨터]]를 추적하는 일 등이 가능하도록 하고 있다. 이러한 헛점은 멜리사(Melissa) [[컴퓨터 웜|웜]]을 만든 개발자를 찾는데 사용되기도 하였다.

MAC 주소를 사용하는 V1 GUID는 {2f1e4fc0-81fd-'''1'''1da-9156-00036a0f876a}와 같이 세 번째 숫자 그룹의 첫 번째 숫자에 "1"을 사용한다. 이후의 알고리즘을 사용하는 GUID는 MAC 주소 대신 [[난수|임의의 숫자]]를 사용하며, {38a52be4-9352-'''4'''53e-af97-5c3b448652f0}처럼 숫자 "4"를 사용한다.

== GUID의 사용 ==
마이크로소프트 [[컴포넌트 오브젝트 모델]](COM)에서는 GUID를 [[윈도 구성 요소|구성 요소]]의 [[인터페이스 (컴퓨팅)|인터페이스]]들을 구별하기 위해 사용한다. 즉 서로 호환되지 않을 수 있는 두개의 컴포넌트가 동일한 인터페이스 이름을 사용하더라도, 각각의 인터페이스는 언제나 고유한 GUID를 갖기 때문에 구별할 수 있게 된다.

COM에서 사용하는 GUID는 다음과 같다:
* IID - 인터페이스 식별자
* CLSID - 클래스 식별자
* LIBID - 타입 라이브러리 식별자
* CATID - 카테고리 식별자 (이 식별자가 클래스에 있으면, 해당 클래스가 특정 클래스 카테고리에 속한다는 것을 표시한다)

DCOM은 다음과 같은 GUID를 추가로 더 사용한다:
* AppID - 응용 프로그램 식별자
* MID - 기계 식별자
* IPID - 인터페이스 포인터 식별자 (RPC 용 인터페이스에 사용)
* CID - 커젤러티(causality) 식별자 (RPC 세션에 사용)
* OID - 오브젝트 식별자 (오브젝트 인스턴스에 사용)
* OXID - 오브젝트 익스포터 식별자 (RPC를 수행하는 시스템 오브젝트의 인스턴스에 사용)
* SETID - 핑 셋 식별자 (오브젝트 그룹에 사용)

위의 GUID들은 쓰이는 형태가 서로 다르다면, 값이 중복되어도 문제가 되지 않는다. 예를 들어, 한 클래스의 CLSID와 다른 클래스의 IID가 서로 같더라도 두 클래스는 문제 없이 존재할 수 있다. 그러나 같은 CLSID를 가지는 두 개의 서로 다른 클래스가 존재하는 것은 불가능하다.

GUID는 또한 [[마이크로소프트 오피스]] 프로그램에서 작성한 문서에도 삽입된다. [[능동 스트리밍 포맷]](Advanced Streaming Format, ASF)에서는 각각의 오디오 및 비디오 스트림들에 GUID를 할당하여 식별한다.

== XML 기반 배급 포맷 ==
[[RSS]]의 일부 버전과 [[Atom]]에는 글 또는 웹로그 포스트를 유일하게 구별할 수 있도록 각각 guid 태그와 id 태그를 가지고 있지만, 이들의 쓰임은 조금 다르다. RSS의 guid 태그에는 어떠한 문자열도 사용할 수 있으며, 실제로는 일반적으로 포스트된 [[URL]]을 사용한다. Atom의 id 태그에는 반드시 유효한 [[URI]]를 사용해야 한다.

== 같이 보기 ==
* [[범용 고유 식별자]]

== 외부 링크 ==
* {{언어링크|en}} [https://web.archive.org/web/20040628105211/http://www.infonuovo.com/dma/csdocs/sketch/instidid.htm InstanceId 값을 위한 DmaId (DCE 범용 고유 식별자, UUIDs)]
* {{언어링크|en}} [http://www.opengroup.org/onlinepubs/9629399/apdxa.htm 범용 고유 식별자 (UUIDs) DCE variant의 문법과 의미]
* {{언어링크|en}} [https://web.archive.org/web/20060615195933/http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt (샘플 코드를 포함하고 있는) Draft UUID specification]
* {{언어링크|en}} [https://web.archive.org/web/20170726052655/http://www.ietf.org/rfc/rfc4122.txt 범용 고유 식별자 (UUID) URN Namespace]
* {{언어링크|en}} [http://www.famkruithof.net/uuid/uuidgen 웹 UUID (GUID) 생성기]

[[분류:식별자]]
[[분류:고유 식별자]]