目的
メール認証実装時に、URLのハッシュ値を生成するときに使用。
通常のuniqid()
やハッシュ関数を組み合わせて汎用性の高い関数を作ってみた
使い方
- 以下の
UUID.php
を作成 (例ではApp/Libs
に配置) -
new UUID()
で使用- MD5でhashしたいとき =>
new UUID('md5')
- sha1でhashしたいとき =>
new UUID('sha1')
- MD5でhashしたいとき =>
UUID.php
.php
<?php
/**
* 限りなくuniqueに近いUUIDを生成する
*/
namespace App\Libs;
class UUID {
/**
* @var
*/
public $prefix;
/**
* @var
*/
public $entropy;
/**
* @param string $prefix
* @param bool $entropy
*
*/
public function __construct($prefix = '', $entropy = false, $hash = null)
{
switch ($hash) {
case 'md5': //32文字の16進数を返す
//実行結果例:719deecdbfec1e13b4ed4e755ed39a47
$this->uuid = md5(uniqid($prefix, $entropy));
break;
case 'sha1': //40文字の16進数を返す
//実行結果例:ad46200ced3a5a5acd6697b11926589cc279b363
$this->uuid = sha1(uniqid($prefix, $entropy));
break;
default: // $entropy:true 実行結果例:145677405658ddab75790ea7.19793837
$this->uuid = uniqid($prefix, $entropy);
break;
}
}
/**
* Limit the UUID by a number of characters
*
* @param $length
* @param int $start
* @return $this
*/
public function limit($length, $start = 0)
{
$this->uuid = substr($this->uuid, $start, $length);
return $this;
}
/**
* @return string
*/
public function __toString()
{
return $this->uuid;
}
}
使い方
1)prefixを付けたいとき
- 第一引数にprefixテキストを渡す。
-
new UUID('prefix_',true)
- 実行結果例:prefix_ad46200ced3a5a5acd6697b11926589cc279b363
2)$entropy付与
- 第二引数にtrue/falseでentropy付与の選択が可能
- entropyを使用すると、返り値に更に線形合同法を使用した値が付与される
これにより一意性がさらに増すとのこと PHP - uniqid
- とはいっても理由無ければ使わなくても問題ないかと
3)ハッシュ関数選択
- 第三引数にハッシュ名を渡す。
new UUID('',false,'MD5')
- デフォルト(引数なし)では
uniqid()
を使って生成する
使用例
laravelデフォルトだと生成tokenに'/'が混入してしまって、URLがおかしくなるので、そういうシーンにはいいかと
.php
/**
* Userパスワードリセットデータの作成
*/
protected function create(array $data)
{
$email = $data['email'];
$token = base64_encode(new UUID('',true));
$this->token = $token;
$created_at = Carbon::now();
return PasswordReset::create(compact('email', 'token','created_at'));
}