0

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

4

1 回答 1

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 个糟糕的字节已经无关紧要了。

于 2015-03-30T01:05:48.227 回答