php簡単なuuidの実現
1830 ワード
uuid:つまり、いつでもデバイス上の結果が繰り返されないことを保証します.
ネット上でいくつかのuuidの実装を見て、ほとんどがタイムスタンプに基づいており、phpが持つuniqid()関数もタイムスタンプに基づいています.
私の実現構想は以下の通りである.
1. まず、以前と重複した時間が生成されないように時間で保証します.私は正確なミリ秒で、保証時間はほとんど唯一です.
2. マルチステートデバイス上で一意であることを保証します.
タイムゾーン情報を追加します.異なるタイムゾーンの内容が重複しないことを保証します.(実は、最後にこれは私にとって今使えないことを考えてみましょう.あなたのサーバーが同時領域に配置され、データ同期が必要でない限り.そして、私はサーバーのIPアドレス情報を追加しました.IPアドレスにはエリア情報が含まれています.)
私はIP情報を加入して、情報が異なる機械で異なることを保証します.
3. 残りのビット数に加えて、同じデバイスに乱数が発生しないことを保証します.
以上のすべての内容を16進数に変換します.
最終フォーマット:timestamp+タイムゾーンフラグ+タイムゾーン+サーバIP+ミリ秒+乱数若干
/*********
* median :
**********/
function my_uuid($median = 3)
{
$dex = "0123456789abcdef";
$mt = microtime();
list($msc, $ts) = explode(" ", $mt);
$uuid = dechex($ts); //
$tm = date("Z");
$sign = 0;//
if($tm < 0) {
$sign = 1;
$tm = abs($tm);
}
$tm = intval($tm/3600);// ,
$uuid .= $sign."".$dex[$tm];
$ip = $_SERVER["SERVER_ADDR"];//ip
$ip = explode(".", $ip);
$ip = array_map(function($v) {
$dex = "0123456789abcdef";
if(isset($v)) {
$idx = intval($v);
return "{$dex[($idx>>4)&0xf]}{$dex[$idx&0xf]}";
} else {return "00";}
}, $ip);
foreach($ip as $v) {
$uuid .= $v;
}
$msc = ltrim($msc, "0."); //
$uuid .= dechex($msc);
for($i = 0; $i < $median; $i++) {<//
$uuid .= $dex[rand()&0xf];
}
return $uuid;
}
ソース:http://blog.csdn.net/reage11
http://www.rhttp.cn