search

Home  >  Q&A  >  body text

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

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

巴扎黑巴扎黑2774 days ago718

reply all(3)I'll reply

  • 巴扎黑

    巴扎黑2017-04-10 16:40:48

    首先不是乘,是取余数

    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的结果不是给人阅读的,这里用十进制并没有什么显著的优点。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 16:40:48

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

    reply
    0
  • 迷茫

    迷茫2017-04-10 16:40:48

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

    reply
    0
  • Cancelreply