84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
网上的一篇文章中中提到: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
0xF423F
% 0x100000
0x100000
至于为什么十六进制,十六进制位数少,计算速度快。uniqid的结果不是给人阅读的,这里用十进制并没有什么显著的优点。
把微秒信息保存下来。16进制可能是为了位操作,也可能是为了省空间,不过省空间完全可以用36进制。
其实应该转换为的是二进制,因为二进制最为贴近计算机的底层,0为断电,1为通电,转换为16进制只是为了方便阅读啊,因为转为二进制是很长的一段
首先不是乘,是取余数
https://github.com/php/php-src/blob/php-7.0.0/ext/standard/uniqid.c#L72-L78
这段代码说的还是很清楚的,首先拿系统时间的秒部分和微秒部分,因为微秒部分最大值是
0xF423F
(999999),所以截取末五位用于uniqid的结果,% 0x100000
就是在截取末五位(十六进制),0x100000
写成十进制就是1048576至于为什么十六进制,十六进制位数少,计算速度快。uniqid的结果不是给人阅读的,这里用十进制并没有什么显著的优点。
把微秒信息保存下来。
16进制可能是为了位操作,也可能是为了省空间,不过省空间完全可以用36进制。
其实应该转换为的是二进制,因为二进制最为贴近计算机的底层,0为断电,1为通电,转换为16进制只是为了方便阅读啊,因为转为二进制是很长的一段