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