基于PHP的UUID/GUID/uniqid替换方法及其可靠性论述
16lz
2021-01-22
为什么不使用自带的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和django位于同一个lighttpd服务器上
- 将node.js服务器更改为Apache服务器
- 当我将它移动到另一台服务器时,计数器将无法工作
- 在Capistrano任务中引用当前服务器
- PHP获取服务器端的相关信息
- 使用ajax在服务器端恢复json时出错
- php清理当前目录下的指定文件和空目录(源码),建议服务器端执行
- Codeigniter在localhost中的url上没有index.php但在服务器中没有
- 自动同步vps服务器或本地文件的数据到百度网盘