欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

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

回复内容:

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

首先不是乘,是取余数

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进制只是为了方便阅读啊,因为转为二进制是很长的一段

相关标签: php uniqid