为什么不使用自带的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;
}


更多相关文章

  1. php和django位于同一个lighttpd服务器上
  2. 将node.js服务器更改为Apache服务器
  3. 当我将它移动到另一台服务器时,计数器将无法工作
  4. 在Capistrano任务中引用当前服务器
  5. PHP获取服务器端的相关信息
  6. 使用ajax在服务器端恢复json时出错
  7. php清理当前目录下的指定文件和空目录(源码),建议服务器端执行
  8. Codeigniter在localhost中的url上没有index.php但在服务器中没有
  9. 自动同步vps服务器或本地文件的数据到百度网盘

随机推荐

  1. 精读白皮书系列1:遇见比特币
  2. 我的2018年终总结分析
  3. Excel可视化(2):13个变种图使用技巧
  4. 【项目分析】度宇宙初体验
  5. 用Excel做排列图
  6. Excel函数(1)统计函数这4个够用了!
  7. Excel函数(2)if、rand、round函数
  8. Excel函数(3):查找引用
  9. Excel函数(4)日期、文本函数
  10. 把 React 作为 UI 运行时来使用 [每日前