★KEYWORD★
📢 응용 소프트웨어에서 사용되는 유사난수 / 유니티에서의 GUID : 프로젝트 내에서 에셋이 사용되거나 이동된 위치에 관계없이 자산을 식별하고 추적할 수 있도록 유지하는 중요한 역할을 함
GUID
전역 고유 식별자(全域固有識別子, 영어: Globally Unique Identifier, GUID / 그위드)는 응용 소프트웨어에서 사용되는 유사난수이다. GUID는 생성할 때 항상 유일한 값이 만들어진다는 보장은 없지만, 사용할 수 있는 모든 값의 수가 2128 = 3.4028×1038개로 매우 크기 때문에, 적절한 알고리즘이 있다면 같은 숫자를 두 번 생성할 가능성은 매우 적다.
기본구조
GUID는 16바이트, 즉 128비트 숫자이다. 16진수로 쓰면 다음과 같은 형태이다
3F 25 04 E0 4F 89 11 D3 9A 0C 03 05 E8 2C 33 01
특별히 규정된 텍스트 표현이 없기 때문에, GUID를 텍스트로 쓰는 방법은 구현에 따라 다를 수 있다. 많이 사용되는 표현 중 하나로 GUID를 순서대로 4바이트, 2바이트, 2바이트, 8바이트로 나눈 뒤 하이픈으로 구분하여 16진수로 작성하고 중괄호로 묶는 방법이 있다. 다음은 위의 GUID를 이 방법으로 표현한 것이다.
{3F2504E0-4F89-11D3-9A0C0305E82C3301}
비슷하게, 자료 구조로 사용할 때는 다음과 같은 형태가 가장 일반적이다.
알고리즘
새로운 GUID를 생성하는 OSF의 알고리즘(V1 GUID)은 광범위한 비판을 받고 있다. 이 알고리즘은 GUID의 마지막 숫자 그룹을 생성할 때 사용자 네트워크 카드의 MAC 주소를 기반으로서 사용하기 때문에, 특정 문서를 작성한 컴퓨터를 추적하는 일 등이 가능하도록 하고 있다. 이러한 헛점은 멜리사(Melissa) 웜을 만든 개발자를 찾는데 사용되기도 하였다. MAC 주소를 사용하는 V1 GUID는 {2f1e4fc0-81fd-11da-9156-00036a0f876a}와 같이 세 번째 숫자 그룹의 첫 번째 숫자에 "1"을 사용한다. 이후의 알고리즘을 사용하는 GUID는 MAC 주소 대신 임의의 숫자를 사용하며, {38a52be4-9352-453e-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를 할당하여 식별한다.
Unity(유니티) 에서의 GUID
Unity에서 에셋, 씬, 오브젝트를 효율적으로 관리하고 충돌이나 참조 누락을 피하는 것은 성공적인 게임 개발에 매우 중요하다. Unity가 이를 수행하는 방법 중 하나는 GUID(Globally Unique Identifier)를 사용하는 것이다.
위에 적힌 것 처럼 GUID는 컴퓨터 시스템에서 식별자로 사용되는 고유 참조 번호이다. GUID의 값은 3F2504E0-4F89-11D3-9A0C-0305E82C3301과 같이 32자의 16진수 문자열로 표현되며 모든 시간과 공간에서 고유하다.
GUID는 프로젝트 내에서 이동하거나 이름을 바꿀 수 있는 위치에 관계없이 자산을 식별하는 일관된 방법을 제공하기 때문에 Unity에서 매우 중요하다. 이러한 일관성은 특히 팀에서 작업하거나 서로 다른 프로젝트 간에 자산을 이동할 때 개체 간 참조를 유지 관리하는 데도 중요하게 작용한다.
💡 유니티에서 GUID는 에셋들을 구분하기 위해서 주어진 고유한 값이다. 같은 프로젝트 내에서는 고유한 값으로 존재한다고 보면 된다. 즉, 다른 프로젝트라면 같은 GUID 값이 존재할 수 있다는 말이다. 만약 다른 프로젝트에서 어떤 에셋을 가져왔는데 GUID가 같다면, 가져온 에셋의 GUID가 자동으로 변경된다. 이 GUID를 통해서 에셋을 불러오거나, 삭제하거나, 변경하거나 하는 일들이 가능하다.
유니티에서 GUID는 어떻게 사용될까?
Unity에서 새 에셋을 생성할 때마다 시스템이 자동으로 에셋에 GUID를 할당한다. 이 GUID는 자산과 연결된 메타 파일에 저장된다. Unity는 이 GUID를 사용하여 프로젝트 전체에서 자산을 추적한다. 예를 들어 Unity에서 새 스크립트를 생성하면 다음과 유사한 내용이 포함된 메타 파일이 생성된다.
1
2
3
4
5
6
7
8
9
10
11
|
iniCopy code
fileFormatVersion: 2
guid: 04f8599c7792c7345a2d7a95e826f34a
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
|
cs |
guid 속성은 이 스크립트의 고유 식별자이다.
즉, 스크립트의 이름을 바꾸거나 다른 폴더로 이동할 수 있으며 Unity는 해당 참조가 에셋의 경로나 이름이 아닌 GUID를 사용하기 때문에 해당 참조를 계속 유지한다.
💡 GUID는 프로젝트 내에서 자산이 사용되거나 이동된 위치에 관계없이 자산을 식별하고 추적할 수 있도록 유지하는 Unity에서 중요한 역할을 한다. Unity에서 GUID가 작동하는 방식을 이해하면 깨진 참조 및 병합 충돌과 같은 일반적인 위험을 방지하여 게임 개발 프로세스를 보다 원활하고 효율적으로 만들 수 있다.
출처 및 참고 : https://howudong.tistory.com/153 / https://coding-shop.tistory.com/145
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)