ページ

2009年11月14日土曜日

UUID を作る - CFUUIDCreate と globallyUniqueString

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

UUID

UUID とは全世界でユニークになることを目的とした識別子(RFC 4122)。
16バイトの数値で、文字列表記では次のように記述される。

84E1C22D-6180-4613-8DCC-7BB22B2C834B

汎用一意識別子 - Wikipedia

同等の目的を持つ識別子としてマイクロソフトが策定した GUID というものもある。
GUID - Wikipedia



サンプル

UUIDを作るサンプルで作ってみた。


ソースコードはこんな感じ。CFUUIDCreate を使うだけ。
Mac Dev Center: CFUUID Reference

@implementation AppController

- (NSString*) stringWithUUID {
CFUUIDRef uuidObj = CFUUIDCreate(nil);//create a new UUID
//get the string representation of the UUID
NSString *uuidString = (NSString*)CFUUIDCreateString(nil, uuidObj);
CFRelease(uuidObj);
return [uuidString autorelease];
}

-(IBAction)createUUID:(id)sender
{
[textView insertText:[self stringWithUUID]];
[textView insertText:@"\n"];
}

-(IBAction)useProcessInfo:(id)sender
{
[textView insertText:[[NSProcessInfo processInfo] globallyUniqueString]];
[textView insertText:@"\n"];
}

@end


実行してみる。


ボタンを押すと UUIDが作成され表示される。



何回か作成してみる。
84E1C22D-6180-4613-8DCC-7BB22B2C834B
901BB03E-6C90-42C8-AF2C-942CC30F88C4
B10E28EA-B1C5-42A9-8C05-4B7A3CA195BA
FBD34652-1A08-44A4-8970-3CD1D53332A4
53AA5438-49B4-4811-AAED-875A0AEF0094
3CA9A6B3-B769-42DA-A2D4-63C49473E0A7

見た目ランダムになるのがわかる。

なお CocoaDev: IDentifiers では CFUUIDCreate の引数に nil ではなく kCFAllocatorDefault を使っていた。



globallyUniqueString

参照したサイトでは -[NSProcessInfo globallyUniqueString] も併せて紹介されていた。
Mac Dev Center: NSProcessInfo Class Reference

リファレンスから転載:
Return Value
Global ID for the process. The ID includes the host name, process ID, and a time stamp, which ensures that the ID is unique for the network.
Discussion
This method generates a new string each time it is invoked, so it also uses a counter to guarantee that strings created from the same process are unique.

UUIDと同等に扱えるようにも見えるがよくわからない。同一プロセス内でのユニーク性は保障されるようだ。

先のサンプルコードで作成した値はこんな感じ。

AF7E4AD9-74CB-4ADD-BC88-9B387BDF3F6E-22623-0000F1F556D83EEA
F5162D07-A2D3-485B-AE49-CB36D8D8332F-22623-0000F25E9D97EFDF
E7EE303A-CF0D-4D5A-9F02-4E9821D41E2E-22623-0000F25EB1A125DE
4C20A7FC-5DE5-460D-B929-4B29EA3A9328-22623-0000F25EBE064F63

UUIDよりも長い。また何回か作成しても一部が変わらないのがわかる。


参考情報

UUID (GUID) Support in Cocoa « Vincent Gable’s Blog
サンプルで使ったコードはここから拝借した。

How to create a GUID/UUID using the iPhone SDK - Stack Overflow