Entry

guidgenとか作ってみた

2015年01月25日

小ネタ。

ソースファイル数百ファイルとか,数万エントリのブログ記事のように,そこそこ分量のあるデータを管理する際,データのIDとしてユニークな文字列を振っておきたくなることがあります。このようなとき,UN*X系のシステムではuuidgen(1)の出力を使うことができます。

uuidgen(1)の出力は,UUID(Universally Unique IDentifier)と呼ばれるもので,具体的には以下のような固定長の文字列になります(出力形式はいろいろある)。

63334536-030d-40cd-b77e-8407bd8e214c

生成方法はRFC 4122にあり,システムのネットワークアドレスやランダムな値などから作られます。あれこれ難しい話はありますが,利用者側としてはとりあえず,このような文字列が,過去に生成されたものにも未来に生成されるものにも,まず被らないとみなしていい,とゆことだけ考えておけば十分です。

一方,Windows環境には,uuidgen(1)のような便利なコマンドはありません。Cygwinなどをインストールすればuuidgen(1)も使えますが,わざわざそのためだけのためにインストールするのも悲しいものがあります。そこで,Windows環境でもユニークな文字列を作るコマンドを作りました。

WindowsにはUUIDによく似たGUIDという値があります。これはCOM/OLEで使われるもので,本来のUUIDとは別物なのですが,体裁が同じで被らないことは同じなので,冒頭の用途としては同じものとみなせます。そこで,ここではGUIDを生成するコマンドを作ります。似たようなツールはいくつもあるんですが。

ソースは以下の通りです。数分で書いたやっつけ仕事でMakefileもなく申し訳ないんですが,適当にコンパイルしてください。GCCを使ったコンパイル方法はコメントに書いてある通りです。

/*
** NOTE: To build:
** gcc -Wall -Wextra -Werror guidgen.c -o guidgen.exe -l ole32 -l rpcrt4
*/
#include <stdio.h>
#include <stdlib.h>
#include <objbase.h>
#include <rpcdce.h>

int
main(void) {
  GUID guid = {0};
  char *s = 0;

  if (CoCreateGuid(&guid) != S_OK)  {
    fprintf(stderr, "CoCreateGuid() failed.\n");
    return 1;
  }
  if (UuidToString(&guid, &s) != RPC_S_OK) {
    fprintf(stderr, "UuidToString() failed.\n");
    return 1;
  }
  fprintf(stdout, "%s", s);
  if (RpcStringFree(&s) != RPC_S_OK) {
    fprintf(stderr, "RpcStringFree() failed.\n");
    return 1;
  }

  return 0;
}

え?こんだけ?みたいな感じですね。意外と使えたので紹介しただけ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN