phpでUUID ( Universally Unique Identifier )を生成出来るライブラリの紹介です。
UUIDとはなんでしょうか?
簡単に言えば理論上絶対に重複しない世界に1つだけの文字列(数値)です。UUIDは128bitの長さ(39桁)を持っていますが、実際には16進数で表されたりしています。
# こんな感じのフォーマットです
123e4567-e89b-12d3-a456-426655440000
「UUIDはどこで使われてるの?」っと気になるところですが、身近なところではLinuxのイーサーネットの認識別や少しフォーマットは変わりますがMACアドレスとして使われたりしています (GUID)、後はブログやニュースサイトの更新を通知するATOM feed ( RSSのようなもの ) なんかにも使われています。
っということで、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 ....
});
}
以上でUUIDライブラリの紹介は終わりです。
今回はPHPのライブラリにフォーカスを置いて紹介しましたが、広く使われている規格なので、各種言語用のライブラリも充実しています。
気になったかたはゼヒ×2チェックしてください!
ramsey/uuid