В 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 исходит и что может быть причиной использования модуля вместо поразрядного и?
Он или он мог написать уникальный идентификатор как 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 паршивых байтов в наши дни не имеет значения.