출처 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10106&eid=eQ+Fwqr9PLwtptT4SPXRxluQhVTpPj1n&qb=amF2YSB1aWS7/by6&pid=fRUz0doi5Tlssus86FVsss--244176&sid=SUWx-imQRUkAAA5a9EE
GUID 생성을 위해서 필요한 정보는 아래와 같습니다.
1. 네트워크 카드의 MAC-Address (IP는 유니크 하지 않습니다.)
2. 현재 실행중인 프로세스의 OS Process ID
3. 현재 timestamp
MAC-Address 는 정말 누가 독한 맘먹고 랜카드를 복제하지 않는 이상 같을리가 없고(이로서 global unique 를 보장), 같은 머신에서 두개의 프로세스가 동시에 GUID를 생성하기를 원할 경우 MAC-Address 가 같고, timestamp도 같을 수 있기 때문에 unique 하지 않을 수 있으므로 여기에 OS Process ID (동일 시점에 두 개의 프로세스 ID가 같을 수 없음)를 합하여 계산하게 됩니다.
그런데 불행이도 자바는 네트워크 카드의 MAC-Address 를 가져올 수 없습니다. 또한 OS Process ID 도 얻어올 수 가 없죠. 그래서 흔히 구현할때는 가상으로 MAC-Address 와 OS Process ID 를 만들어서 사용합니다. 랜덤 + 현재 VM의 메모리 사용량 등등을 합해서 만들어 내죠. 궂이 MAC-Address와 OS Process ID를 얻어오려 한다면 JNI를 통해서 얻어 올 수는 있겠지만, 플랫폼 독립성을 보장하지 못하게 되는 관계로 잘 사용하지 않습니다.
꼭 '6B0FCF35-CE68-455e-915F-C57216859C19' 이런 형태의 32 hexa digit가 아니어도 된다면 자바에 있는 VMID를 사용하시는건 어떨가요? 얘도 나름대로 unique 한 ID이므로 사용해도 큰 문제는 없으리라 보여지네요.
사용 방법은 아래와 같습니다.
RMI 쪽에서 사용하기 위해 만들어진 클래스이구요. RMI를 지원하는 JVM이라면 모두 갖고 있을 것입니다. 꼭 32 hexa digit로 만들어서 MS에서 사용하는 방식으로 쓰셔야 겠다면 VMID를 얻어내어 적당히 잘라서 사용하시면 될 것 같습니다.
중간에 콜론(:)을 제거하고, 32자리만 잘라서 적당히 하이폰(-)을 넣어서 사용하시면 되겠죠.
VMID is a identifier that is unique across all Java virtual machines. VMIDs are used by the distributed garbage collector to identify client VMs.
이렇게 자바 API 문서에 적혀있는데요. 모든 자바 VM을 통틀어 유니크함을 보장하므로 이와 비슷한 java.rmi.server.UID 보다 더 유니크 합니다. ^^; UID도 쓸만은 하지만 일단 VM을 가로질러 유니크함을 보장해주지는 못하니깐요.
근데 VMID도 소스를 살펴보면 아시겠지만, 정말 글로벌 유니크는 보장하지 못합니다. 이유인 즉슨 얘도 로컬 IP 주소를 얻어와서 계산을 하기 때문에.. IP는 얼마든지 같을 수 있으므로 그런 것이죠. 하지만 어차피 pseudo 하게 MAC-Address를 만들어내나 그거나 같기 때문에 그냥 사용하셔도 될듯 하네요.
편안한 밤 되세요~
GUID 생성을 위해서 필요한 정보는 아래와 같습니다.
1. 네트워크 카드의 MAC-Address (IP는 유니크 하지 않습니다.)
2. 현재 실행중인 프로세스의 OS Process ID
3. 현재 timestamp
MAC-Address 는 정말 누가 독한 맘먹고 랜카드를 복제하지 않는 이상 같을리가 없고(이로서 global unique 를 보장), 같은 머신에서 두개의 프로세스가 동시에 GUID를 생성하기를 원할 경우 MAC-Address 가 같고, timestamp도 같을 수 있기 때문에 unique 하지 않을 수 있으므로 여기에 OS Process ID (동일 시점에 두 개의 프로세스 ID가 같을 수 없음)를 합하여 계산하게 됩니다.
그런데 불행이도 자바는 네트워크 카드의 MAC-Address 를 가져올 수 없습니다. 또한 OS Process ID 도 얻어올 수 가 없죠. 그래서 흔히 구현할때는 가상으로 MAC-Address 와 OS Process ID 를 만들어서 사용합니다. 랜덤 + 현재 VM의 메모리 사용량 등등을 합해서 만들어 내죠. 궂이 MAC-Address와 OS Process ID를 얻어오려 한다면 JNI를 통해서 얻어 올 수는 있겠지만, 플랫폼 독립성을 보장하지 못하게 되는 관계로 잘 사용하지 않습니다.
꼭 '6B0FCF35-CE68-455e-915F-C57216859C19' 이런 형태의 32 hexa digit가 아니어도 된다면 자바에 있는 VMID를 사용하시는건 어떨가요? 얘도 나름대로 unique 한 ID이므로 사용해도 큰 문제는 없으리라 보여지네요.
사용 방법은 아래와 같습니다.
public class VMIDTest { |
RMI 쪽에서 사용하기 위해 만들어진 클래스이구요. RMI를 지원하는 JVM이라면 모두 갖고 있을 것입니다. 꼭 32 hexa digit로 만들어서 MS에서 사용하는 방식으로 쓰셔야 겠다면 VMID를 얻어내어 적당히 잘라서 사용하시면 될 것 같습니다.
중간에 콜론(:)을 제거하고, 32자리만 잘라서 적당히 하이폰(-)을 넣어서 사용하시면 되겠죠.
VMID is a identifier that is unique across all Java virtual machines. VMIDs are used by the distributed garbage collector to identify client VMs.
이렇게 자바 API 문서에 적혀있는데요. 모든 자바 VM을 통틀어 유니크함을 보장하므로 이와 비슷한 java.rmi.server.UID 보다 더 유니크 합니다. ^^; UID도 쓸만은 하지만 일단 VM을 가로질러 유니크함을 보장해주지는 못하니깐요.
근데 VMID도 소스를 살펴보면 아시겠지만, 정말 글로벌 유니크는 보장하지 못합니다. 이유인 즉슨 얘도 로컬 IP 주소를 얻어와서 계산을 하기 때문에.. IP는 얼마든지 같을 수 있으므로 그런 것이죠. 하지만 어차피 pseudo 하게 MAC-Address를 만들어내나 그거나 같기 때문에 그냥 사용하셔도 될듯 하네요.
편안한 밤 되세요~
'etc > old' 카테고리의 다른 글
8080 포트를 이용하는 Oracle XDB (0) | 2008.12.18 |
---|---|
WEB-INF/classes에서 .properties 또는 .xml 파일 읽어 들이기 (환경설정) (0) | 2008.12.16 |
PhotoShop에서 ICO 파일 만들기 (0) | 2008.12.15 |
syntaxhighlighter를 tistory에 설치 하는 방법 (1) | 2008.12.12 |
[Java] byte형 변수를 부호비트를 무시하여 int형 변수에 대입하기 (0) | 2008.12.11 |