PHP uniqid() 源代码相关问题
questions related to source code of PHP uniqid()
在PHP源代码函数uniqid()中有如下C代码:
(我删除了一些类型以缩短它)
//...
struct timeval tv;
gettimeofday(&tv, NULL);
int sec = (int) tv.tv_sec;
int usec = (int) (tv.tv_usec % 0x100000);
// The max value usec can have is 0xF423F,
// so we use only five hex digits for usecs.
printf("%08x%05x", sec, usec);
//...
如果我们把批评放在一边,他们会尝试生成 64 位时间戳。
0xF423F大概是CLOCKS_PER_SEC - 1(CLOCKS_PER_SEC是十进制的1000000),
但是这个 0x100000 是从哪里来的,使用模而不是按位与的原因是什么?
她或他可以将唯一 ID 写为 printf("%08x%08x", sec, usec)
sample output:
55189926000eb16f
5518997900051219
5518997a0005171b
位置8到10的零是一致的,它们不增加熵,所以他想去掉那些零。具有相同熵的新 UID 将缩短 3 个字节。他可以简单地使用 printf("%08x%05x", sec, usec);
sample output:
55189926eb16f
5518997951219
5518997a5171b
但这是假设 usec 保证小于 0x100000 否则 UID 将长达 16 个字节。您需要 % 0x100000
购买保险。也和& 0xFFFFF
一样。从技术上讲保险应该是 % 1000000 (decimal)
,但其实没关系,它仍然是相同的熵。
或者我们可以只使用 16 字节的版本,因为现在节省 3 个糟糕的字节并不重要。
在PHP源代码函数uniqid()中有如下C代码: (我删除了一些类型以缩短它)
//...
struct timeval tv;
gettimeofday(&tv, NULL);
int sec = (int) tv.tv_sec;
int usec = (int) (tv.tv_usec % 0x100000);
// The max value usec can have is 0xF423F,
// so we use only five hex digits for usecs.
printf("%08x%05x", sec, usec);
//...
如果我们把批评放在一边,他们会尝试生成 64 位时间戳。
0xF423F大概是CLOCKS_PER_SEC - 1(CLOCKS_PER_SEC是十进制的1000000),
但是这个 0x100000 是从哪里来的,使用模而不是按位与的原因是什么?
她或他可以将唯一 ID 写为 printf("%08x%08x", sec, usec)
sample output:
55189926000eb16f
5518997900051219
5518997a0005171b
位置8到10的零是一致的,它们不增加熵,所以他想去掉那些零。具有相同熵的新 UID 将缩短 3 个字节。他可以简单地使用 printf("%08x%05x", sec, usec);
sample output:
55189926eb16f
5518997951219
5518997a5171b
但这是假设 usec 保证小于 0x100000 否则 UID 将长达 16 个字节。您需要 % 0x100000
购买保险。也和& 0xFFFFF
一样。从技术上讲保险应该是 % 1000000 (decimal)
,但其实没关系,它仍然是相同的熵。
或者我们可以只使用 16 字节的版本,因为现在节省 3 个糟糕的字节并不重要。