티스토리 툴바


달력

01

« 2012/01 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
2010/09/15 08:51

20100915.mp3 Various/BeatMaker2010/09/15 08:51


철호(꺄오), 성형(치), 용철(응)
아이폰 어플 BeatMaker로 제작
저작자 표시 비영리 변경 금지
Posted by Angels_Servant
2009/11/19 11:04

전역 고유 식별자(GUID) 골방/문법2009/11/19 11:04

전역 고유 식별자

위키백과 ― 우리 모두의 백과사전.

전역 고유 식별자(영어: Globally Unique Identifier, GUID)는 소프트웨어애플리케이션에서 사용되는 유사 난수이다. GUID는 생성할 때 항상 유일한 값이 만들어진다는 보장은 없지만, 사용할 수 있는 모든 값의 수가 2128 = 3.4028×1038개로 매우 크기 때문에, 적절한 알고리즘이 있다면 같은 숫자를 두 번 생성할 가능성은 매우 적다.

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

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

기본 구조

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}

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

시작 위치(비트) 끝 위치(비트) 형식 guidef.h의 C 자료형[1]
0     31 32비트 부호없는 정수 unsigned long
32         47 16비트 부호없는 정수 unsigned short
48     63 16비트 부호없는 정수 unsigned short
64     127 8비트 부호없는 정수 8개 unsigned char[8]

[1] C자료형은 컴파일러에 따라 크기가 다를 수 있다.

 알고리즘

새로운 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를 할당하여 식별한다.

 XML 기반 배급 포맷

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

출처 :
http://ko.wikipedia.org/wiki/%EC%A0%84%EC%97%AD_%EA%B3%A0%EC%9C%A0_%EC%8B%9D%EB%B3%84%EC%9E%90


저작자 표시 비영리 변경 금지
Posted by Angels_Servant

구조체는 메모리에 어떤 식으로 저장될까
다음과 같은 소스를 보자.

 
  1. #include <stdio.h>   
  2.   
  3. typedef struct _TEST{   
  4.     char cData;   
  5.     short sData;   
  6.     int iData;   
  7. }TEST;   
  8.   
  9. int main()   
  10. {   
  11.     TEST TData={0,};   
  12.   
  13.     printf("cData size : %d\n"sizeof(TData.cData));   
  14.     printf("sData size : %d\n"sizeof(TData.sData));   
  15.     printf("iData size : %d\n"sizeof(TData.iData));   
  16.     printf("TData size : %d\n"sizeof(TData));   
  17.        
  18.     return 0;   
  19. }  



TEST 구조체 변수인 TData는 char형 데이터(1byte), short형 데이터(2byte), int형 데이터(4byte)를 가지고 있으므로 1+2+4=7byte의 크기를 가질 것 처럼 보인다. 하지만 이 소스를 컴파일하고 실행을 해보면 다음과 같은 결과가  나온다.



분명히 cData(1) + sData(2) + iData(4) = 7임에도 불고하고 TData의 크기는 8바이트라고 하니 참 이상한 일이다.

이는 현재 우리가 쓰는 32비트 컴퓨터에서 32비트 컴파일러를 사용하였기 때문에 32비트 즉, 4바이트로 데이터를 처리하는 것에 가장 최적화되어 있기 때문에 데이터를 4바이트 공간으로 저장하기 때문이다.

이 TData란 구조체는 8바이트에 다음과 같이 저장되어 있다.

cData
??
sData
sData
iData
iData
iData
iData

cData를 저장하고, 4바이트중에 3바이트가 남아있기 때문에 sData를 3바이트 중에 2바이트의 공간에 저장하고,
iData를 저장하려 하니 1바이트밖에 남아있지 않기 때문에 4바이트의 공간을 따로 만들어 저장하게 되는 것이다.

그럼 이제 위의 소스에서 변수 선언의 순서를 한 번 바꿔 보자.

 
  1. typedef struct _TEST{   
  2.     char cData;   
  3.     int iData;   
  4.     short sData;   
  5. }TEST;  



변수 선언의 순서를 바꿨을 뿐인데 신기하게도 같은 구조체의 크기가 8에서 12로 늘어나버렸다.
이 TData 구조체 변수는 다음과 같이 저장되어 있을 것이다.

cData
(1byte)
empty
(3byte)
sData
(2byte)
empty
(2byte)
iData
(4byte)

이처럼 컴파일러는 4바이트에 맞춰서 데이터를 저장하는 것을 볼 수 있다. 이것을 막으려면 어떻게 해야할까.

이것을 해결하려면 #pragma pack() 이라는 전처리어를 사용하면 된다.
구조체 하나를 더 추가한 다음 소스를 보자.

 
  1. #include <stdio.h>   
  2.   
  3. typedef struct _TEST{   
  4.     char cData;   
  5.     int iData;   
  6.     short sData;   
  7. }TEST;   
  8.   
  9. #pragma pack(1)   
  10. typedef struct _TEST2{   
  11.     char cData;   
  12.     int iData;   
  13.     short sData;   
  14. }TEST2;   
  15.   
  16. int main()   
  17. {   
  18.     TEST TData={0,};   
  19.     TEST2 TData2={0,};   
  20.   
  21.     printf("TData size : %d\n"sizeof(TData));   
  22.     printf("TData2 size : %d\n"sizeof(TData2));   
  23.        
  24.     return 0;   
  25. }  



#pragma pack(1)에서 1은 1바이트 단위로 저장하겠다는 것이다. 따라서 TData와 TData2의 내용물은 같으나 크기는 다른 것을 확인할 수 있다.

 그렇다면, 왜 모두 1바이트로 해서 메모리의 낭비가 없도록 하지 않는 것일까?
 그것은, 아까도 이야기하였듯이 32비트 CPU에서는 4바이트(32비트)의 단위로 데이터를 처리하는 것이 가장 빠르게 때문이다. 즉, #pragma pack(1) 이라고 선언해놓고 원래대로 돌려놓지 않는다면 속도저하의 문제가 생길 수 있다.
 따라서, 위의 소스에서 구조체 선언이 끝나는 부분에 #pragma pack(4)라고 선언해주어 할 것이다.

 하지만, 여기에도 문제가 있다.
 만약, 이 소스를 32비트의 PC가 아닌 다른 CPU가 장착된 장비에서 컴파일하게 된다면 어떻게 될 것인가. 예를 들면 임베디드 시스템 같은 8~16비트 CPU에서 말이다.
 소스를 일일히 찾아서 CPU에 맞게 고쳐주고 다시 컴파일해야 되는 불편함과 어려움이 생기게 된다.

 이럴때를 위해서 좀 더 우아하게 쓰는 코드가 있다.

 
  1. #pragma pack(push, 1)   
  2. typedef struct _TEST2{   
  3.     char cData;   
  4.     int iData;   
  5.     short sData;   
  6. }TEST2;   
  7. #pragma pack(pop)  



 기존의 바이트를 스택에 push하고 1바이트 단위로 처리한다음 끝나는 부분에 원래의 바이트 단위를 pop해주는 코드이다. 보통은 이렇게 사용하면 되겠다.

 pragma에는 다른 용도(warning을 표시하지 않게 한다던가하는 기능들)도 있지만, 이는 다음에 알아보도록 하자.

------------------------------------퍼옴

http://lsea.tistory.com/220

저작자 표시 비영리 변경 금지
Posted by Angels_Servant
2009/10/26 15:57

서버프로그래밍 마소연재 분류없음2009/10/26 15:57


http://cafe.naver.com/cyberzone.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=655
저작자 표시 비영리 변경 금지
Posted by Angels_Servant
http://www.boost-consulting.com/boost_1_35_0_setup.exe

http://yesarang.tistory.com/
// 추천사이트 무단도용링크;; 주인님께 죄송하다는 말씀밖엔!;


저작자 표시 비영리 변경 금지
Posted by Angels_Servant