基于PHP的UUID/GUID/uniqid替换方法及其可靠性论述

为什么不使用自带的uniqid?
大多数时候,使用php自带的基于微秒的uniqid()函数来生成唯一标识,是可行的。但是既然是基于微秒,就会在以下二种情景生成重复的结果。
1、多并发
2、多服务器

解决办法:
知道了导致问题的原因,小鱼想找到一个方案来解决。
1、获得程序执行时那一瞬间的时间点,以此来当成唯一id;
2、使用程序执行线程(或进程)的ID,以此来区分多并发时唯一id相同的情景;
3、多服务器情形下,追加使用各服务器的唯一id,如编号、别名、ip……
这样便可得到一个任何时候均为唯一的字符串


/**
* 获得用于数据库当主键的hashid<br>
* 使用ripemd160的哈希算法,字符串为进程id+基于微秒的唯一id〈br〉
* 思路:机器标识+进程id+当前微秒数
* @TODO 当有多台服务器时,还要再加一个服务器的IP或id
* @return string
*/
public static function uuid()
{
    $pid = getmypid();//进程id。在同一台机器下高并发时,极易得到相同的毫秒
    time_nanosleep(0, 1000);//延时1000纳秒=1毫秒。同一进行连续使用本函数时,可能得到相同的毫秒,于是需要这个延时来保证每次得到的毫秒未被使用。
    $timetick = microtime(TRUE)*1000;//微秒
    $uuid = hash('ripemd160', $pid.'+'.$timetick);
 
    return $uuid;
}


你可能感兴趣的:(PHP,方法,uuid)