PHP 的 uniqid() 函数的两点疑问?

网上的一篇文章中中提到:PHP 的 uniqid() 函数是将当前微妙乘以一个较大的数(1048576)后再转为十六进制的,有两点我不明白:
1.为什么要乘以一个固定的数在转换成十六进制,直接转不行吗?
2.为什么要转为16进制,十进制不行吗?
望赐教,谢谢!

阅读 4.2k
3 个回答

首先不是乘,是取余数

https://github.com/php/php-src/blob/php-7.0.0/ext/standard/uniqid.c#L72-L78

    gettimeofday((struct timeval *) &tv, (struct timezone *) NULL);
    sec = (int) tv.tv_sec;
    usec = (int) (tv.tv_usec % 0x100000);

    /* The max value usec can have is 0xF423F, so we use only five hex
     * digits for usecs.
     */

这段代码说的还是很清楚的,首先拿系统时间的秒部分和微秒部分,因为微秒部分最大值是0xF423F(999999),所以截取末五位用于uniqid的结果, % 0x100000就是在截取末五位(十六进制), 0x100000写成十进制就是1048576

至于为什么十六进制,十六进制位数少,计算速度快。uniqid的结果不是给人阅读的,这里用十进制并没有什么显著的优点。

把微秒信息保存下来。
16进制可能是为了位操作,也可能是为了省空间,不过省空间完全可以用36进制。

其实应该转换为的是二进制,因为二进制最为贴近计算机的底层,0为断电,1为通电,转换为16进制只是为了方便阅读啊,因为转为二进制是很长的一段

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题