PHPプログラムに関する各種メモ書き

PHPで衝突しにくいユニークなID(ハッシュ)uuidを生成する

● uuidより短いHashid を使用するにはこちら

https://packagist.org/packages/vinkla/hashids

衝突しにくいユニークなID(ハッシュ)を生成したい時UUIDを使うことがありますが、PHPでは簡単に生成できます。

● ramsey/uuid のインストール

composer require ramsey/uuid

● uuidの生成

<?php
require 'vendor/autoload.php';

use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\Exception\UnsatisfiedDependencyException;

try {

    // Generate a version 1 (time-based) UUID object
    $uuid1 = Uuid::uuid1();
    echo $uuid1->toString() . "\n"; // i.e. e4eaaaf2-d142-11e1-b3e4-080027620cdd

    // Generate a version 3 (name-based and hashed with MD5) UUID object
    $uuid3 = Uuid::uuid3(Uuid::NAMESPACE_DNS, 'php.net');
    echo $uuid3->toString() . "\n"; // i.e. 11a38b9a-b3da-360f-9353-a5a725514269

    // Generate a version 4 (random) UUID object
    $uuid4 = Uuid::uuid4();
    echo $uuid4->toString() . "\n"; // i.e. 25769c6c-d34d-4bfe-ba98-e0ee856f3e7a

    // Generate a version 5 (name-based and hashed with SHA1) UUID object
    $uuid5 = Uuid::uuid5(Uuid::NAMESPACE_DNS, 'php.net');
    echo $uuid5->toString() . "\n"; // i.e. c4a760a8-dbcf-5254-a0d9-6a4474bd1b62

} catch (UnsatisfiedDependencyException $e) {

    // Some dependency was not met. Either the method cannot be called on a
    // 32-bit system, or it can, but it relies on Moontoast\Math to be present.
    echo 'Caught exception: ' . $e->getMessage() . "\n";

}

● uuidを短い文字列に変換する

例えば バージョン4の uuid だと 25769c6c-d34d-4bfe-ba98-e0ee856f3e7a のような文字列になります。
これを短くしてみましょう。

● pascaldevink/shortuuid のインストール

composer require pascaldevink/shortuuid

● uuidを短くする(そして戻す)

version4 の uuidを取得し、その後短く変換し、その後戻して表示します。

use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\Exception\UnsatisfiedDependencyException;
use PascalDeVink\ShortUuid\ShortUuid;
echo 'UUID(version 4)';
$uuid4 = Uuid::uuid4();
dump( $uuid4->toString() );

echo 'short UUID(encoded)';
$shortuuid = new ShortUuid();
$su_string = $shortuuid->encode($uuid4);
dump( $su_string );

echo 'UUID(decoded)';
dump( $shortuuid->decode($su_string)->toString() );

( dump 関数は各自ご用意を。なければ echo で置き換えてください。 )

結果

● Laravel で uuid を使用する

Laravel 5.6 以降なら次のメソッドが使用できます

Str::uuid();
Str::orderedUuid();
添付ファイル1
No.1319
05/23 15:57

edit

添付ファイル