UUID/GUID

  • デル株式会社
  • 古い記事

    今でも使えるんだろうか?

    OLEオブジェクトやリモートプロシジャでは
    UUID(Universally Unique Identifer)と呼ばれる
    必ず一意の値を取得して利用します。
     
    この値は、OSF/DCE で定義されたアルゴリズムで取得します。
    生成されたUUID/GUIDは、どのマシンでいつ取得しても必ず異なる値となります。
    この値を生成するアルゴリズムは、

        現在の時刻
        時計の逆進を処理するクロックシーケンスなど
        高速割り当てに対処するためのカウンタ
        ネットワークアダプタのIEEEマシンIDまたはマシンごとに異なる状態情報

    から合成された値を利用します。

    ●UUIDとGUIDの関係

      UUIDは元々RPCのインターフェースを定義されるために利用することを目的にしていますが、
      WindowsではこのIDをCOM(Compnent Object Model)の
      IID(Interface Identifer)やCLSID(Class Identifer)に利用し、
      これらのIDを総称してGUIDと呼んでいます。
     
    実際にこのIDを取得するには、Win32 RPC API UUIDCreateをるか、
      Win32 OLE API CoCreateGuid を利用することで取得することができます。

    と、どっかのHPに書いてあった。。間違っていたら修正してちょ。。
    これだけでは、全部パクリになってしまうので、GUIDとUUID取得のサンプル作ってみた。
    二重インクルードとかに使うと良いかも。。VC6.0のころは使ってたなぁ。。

    使用する構造体MSDN確認のこと。
    typedef struct _GUID

         unsigned long  Data1;
         unsigned short Data2;
         unsigned short Data3;
         unsigned char  Data4[8];

    } GUID, UUID;

    //GUID
    void CreateGuid()
    {
         GUID st_Guid = GUID_NULL;
         CString strGuid;

         ::CoCreateGuid(&st_Guid);

         //MSDNサンプルの文字列変換バージョン(やっぱりパクリ)
         strGuid.Format(
            "GUID : {%08lX-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}",
         st_Guid.Data1, st_Guid.Data2, st_Guid.Data3,
             st_Guid.Data4[0], st_Guid.Data4[1], st_Guid.Data4[2], st_Guid.Data4[3],
             st_Guid.Data4[4], st_Guid.Data4[5], st_Guid.Data4[6], st_Guid.Data4[7]
         );

         //変換方法はUUIDのものも使える

         MessageBox(strGuid);
    }

    //UUID
    void CreateUuid()
    {
         GUID st_Uuid = GUID_NULL;
         CString strUuid;
         unsigned char* szUuid;

         HRESULT hr = ::UuidCreate(&st_Uuid);//UUID生成

         ::UuidToString(&st_Uuid,&szUuid);     //UUID文字列に変換

         strUuid.Format("UUID :{%s}",szUuid);

         MessageBox(strUuid);
    }   

    関連記事

    ページ上部へ戻る