phpでUUIDを作成する



phpでUUID ( Universally Unique Identifier )を生成出来るライブラリの紹介です。

UUIDとはなんでしょうか?

簡単に言えば理論上絶対に重複しない世界に1つだけの文字列(数値)です。UUIDは128bitの長さ(39桁)を持っていますが、実際には16進数で表されたりしています。

# こんな感じのフォーマットです
123e4567-e89b-12d3-a456-426655440000


「UUIDはどこで使われてるの?」っと気になるところですが、身近なところではLinuxのイーサーネットの認識別や少しフォーマットは変わりますがMACアドレスとして使われたりしています (GUID)、後はブログやニュースサイトの更新を通知するATOM feed ( RSSのようなもの ) なんかにも使われています。

っということで、UUIDをジェネレート出来るライブラリを使ってみましょう。
 

UUIDライブラリのインストール 〜 使い方

パッケージのインストールにはcomposerを使います。

# コマンドラインからインストールする場合
composer require ramsey/uuid

# composer.jsonに記載する場合
"ramsey/uuid": "^3.4"


導入を終えるとuseメソッドで呼び出してUUIDパッケージを使うことが出来ます。用意されているUUID生成メソッドは4種類。UUID (1, 3, 4, 5)が生成できます。

use Ramsey\Uuid\Uuid;

$uuid = Uuid::uuid1();

// toStringメソッド無しでもoutputは出来ます
echo $uuid->toString();

// TimestanpベースのUUID1
echo Uuid::uuid1();
// i.e: a8bafe3e-2246-11e6-b6fd-ac87a30725c0

// MD5ベースのUUID3
echo Uuid::uuid3(Uuid::NAMESPACE_DNS, 'your-key');
// i.e: d90c5fa1-3989-3ef1-a2cb-927f5f217634 

// ランダムに生成してくれるUUID4
// UUID4が一番使いやすいです
echo Uuid::uuid4();
// i.e: 7c82807b-f1b7-497f-881e-694537ad2201

echo Uuid::uuid5(Uuid::NAMESPACE_DNS, 'your-key');
// i.e: febd7fad-a923-5c39-95e0-19511a7145a5


パッケージを導入したのはいいけど使いドコロが、、、と疑問に思うところですが、リレーションが噛んでいるデータベースなんかにピッタリです。

例えばトランザクション処理が必要で複数のテーブルにデータがまたがっている時。最後に登録したIDを取得する時ですね。
( UUIDをprimary-key代わりに使うのはキツイと思われます )

テーブルにUUID用のカラムを作っていると、大量のデータを登録 + 複数のテーブルと関係を持っている時など安全にデータの登録 + 確実にデータの整合性をとることが出来ます。

下記のスニペットはLaravelフレームワークのquery builderを使ったユーザー登録時のサンプルです。

use Ramsey\Uuid\Uuid;

public function uuid_use_case($data)
{
    // uuidを変数に格納
    $uuid = Uuid::uuid4();

    // 形式上dateの処理を書いているのであまり意味はありません
    $datetime = \Carbon\Carbon::now();

    \DB::transaction(function () use ($uuid, $data, $datetime) {

      // 各種idはauto-incremantを想定しています
      // userテーブルに登録
      \DB::table('user')->insert([
          'username' => $data['user_name'],
          // * サンプルなのでエンコードは割愛してます
          'password' => $data['password'],
          'uuid' => $uuid,
          'created_at' => $datetime,
          'updated_at' => $datetime,
      ]);

      /*
      * UUIDを使うことで、この処理が変わります
      $user_id = \DB::table('user')
                    ->select('id')
                    ->orderBy('id', 'desc') // 又は created_at
                    ->take(1)
                    ->get();
       */

       // UUIDをキーとして登録したデータidを取得
       // ユニークIDなので大量のインサートがあっても整合性が保たれます
       $user_id = \DB::table('user')
                      ->select('id')
                      ->where('uuid', $uuid)
                      ->get();
       
       // user_infoテーブルに登録
       // user_idがリレーションを取っています
       \DB::table('user_info')
            ->insert([
              'user_id' => $user_id,
              'user_data1' => $data['data_1'],
              'user_data2' => $data['data_2'],
              'created_at' => $datetime,
              'updated_at' => $datetime,
            ]);
            
        // go on ....

    });
}


Summary

以上でUUIDライブラリの紹介は終わりです。

今回はPHPのライブラリにフォーカスを置いて紹介しましたが、広く使われている規格なので、各種言語用のライブラリも充実しています。

気になったかたはゼヒ×2チェックしてください!

ramsey/uuid

 

この記事のカテゴリ
プログラミング

この記事に付けられているタグ