与PHP uniqid()源代码相关的问题

时间:2015-03-29 20:24:32

标签: php c unique-id gettimeofday timeval

在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 的来源是什么?使用模数而不是按位的原因是什么?

1 个答案:

答案 0 :(得分:2)

她或他可以将唯一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个糟糕的字节并不重要。