вопросы, связанные с исходным кодом PHP uniqid ()

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

  • 2
    На ваш вопрос действительно может ответить только тот, кто написал код, а кто-то еще может только по-настоящему размышлять о причине
  • 0
    Я не согласен с вами. Код не так сложно объяснить, но мне не хватает хорошего понимания вычисления природы в миллисекундах.
Показать ещё 2 комментария
Теги:
unique-id
gettimeofday

1 ответ

2
Лучший ответ

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

  • 0
    Почему "он"? Женофоб!
  • 1
    @LightnessRacesinOrbit Он :) статистически правильно.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню