../../image/benilogo.gifPHP4 について


PHP の uniqid( ) について。

 PHPのマニュアル uniqid() 

uniqid( ) 関数 ユニークな ID の実験
識別ID の発生も 実際にどんなことになるのかを実行してみる。
test2/uniqid.php
<?php

  $uniq_id = uniqid("");
  $uniq_len = strlen($uniq_id);
  echo "uniqid(\"\") = $uniq_id 長さは $uniq_len となる。",uniqid(""),"\n";
  echo "\n\n";
  echo uniqid(""),"    ",uniqid(""),"\n\n";

?>
uniqid("") = 4308092308815 長さは 13 となる。430809230d631


4308092312451    4308092317270


マニュアルによると ミリ秒単位の現在時刻に基づき先頭辞 (prefix)を付けたユニークなIDを返します。 とあり
そんなような数字を返している。 同じ行で 実行しても 確かにユニークな数字が返ってきている。 ミリ秒が シードみたいなものだから
13桁のうち 先頭の何桁かは同じになっている。 この例だと 43080923***** は同じ。
全桁が変わるのはいつなんだろう? と言うか この ミリ秒はどこから来ているのか? とふと疑問に思う。 microtime( ) かな?
マイクロタイムを取得
  echo "マイクロタイム = ",getmicrotime(),"\n";
  echo "microtime()だけで取得すると ",$ar= microtime(),"\n";

  //var_dump($ar);
  echo "\n\n\n";
function getmicrotime(){
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$sec + (float)$usec);
    }


?>
マイクロタイム = 1124600099.095
microtime()だけで取得すると 0.09505100 1124600099

 これは違うかな? と思ったが uniqid( ) で返って来ているのは 16進数。

ならば 1124600099 を 16進にすると 43080923 !! ヒンポーン

これは通算秒のようです。

 という事は uniqid("") の数値は ミリ秒だから 1/1000 秒 を 16 進で返しているってことらしい。

また、 prefix を付ければ ここ(このマシンのこのスクリプト)ではまず ユニークさを 保てることになる。
例えば、 uniqid("abc") とすると

  abc4308092308815 とこんな数値(文字列)を得るようになる。

なるほど 納得。

ついでに オプションの lcg パラメーターを付けると
uniqid("",TRUE) = 43080923172829.94258219 長さは 23 となる。  長い23文字を返す。


"combined LCG" を返り値の最後に追加します。 とマニュアルに書かれている。 けど combined LCG って 何?

複合型の線形合同発生器(LCG)らしい。これは lcg_value() にそれらしきことが書かれている。




























目次に戻る

2005/08/21start ********* Last Update 2006/11/12 19:26 JST

(C) Y.Kondou,2005,2006 All Rights, Reserved.
その他、お気づきの点がありましたら連絡先はこちらから