takami_hirokiの日記

2010-10-25

PHPで一意な値を生成する

MySQLレプリケーションのように、ステートメントベースのレプリケーションの場合には、auto_incrementなどの実行時に値が不定な関数は利用が推奨されません。従って、プログラム側で、一意となる値を生成する必要があります。そのような場合、PHPでは、以下のような「uniqid」という関数が利用できます。

string uniqid ([ string $prefix = "" [, bool $more_entropy = false )

マイクロ秒単位の現在時刻にもとづいた、接頭辞つきの一意な ID を取得します。

404 Not Found

uniqid関数の利用例

以下のように書くことで、$prefixの後に、マイクロ秒単位の現在時刻に基づいた文字列が生成されます。

[root]# php -r 'echo uniqid("PRIMARY_");'
PRIMARY_4cc4f4844c2ed

より一意な値とするために

上記の書き方は、あくまで、マイクロ秒単位の違いしかないため、同じ値になる可能性はゼロではありません。

従って、より一意性を高めるために「$prefixを固定文字列ではなく乱数とする」ことを考えます。

[root]# php -r 'echo uniqid(mt_rand());'
5770971284cc4f4b946722

さらに、一意性を高めるために、「第二引数の$more_entropy」を利用します。

TRUE にすると、uniqid() は 返り値の最後にさらに別のエントロピーを (線形合同法を使用して) 追加します。これにより、結果がより一意になります。

404 Not Found
[root]# php -r 'echo uniqid(mt_rand(), true);'
6929848604cc4f53f3ec374.52375463

DBPK生成に利用する場合

Modelの層で、以下のような関数を用意して利用するとよいかもしれません。

ここでは、md5関数を通しています。難読化と、桁数揃えを同時にできて便利かと思います。

public function getPrimaryKey() {
    return md5( uniqid(mt_rand(), true) );
}

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/takami_hiroki/20101025/p1