2015-03-29 1 views
0

В PHP функции исходного кода uniqid() имеют следующий код C: (я удалил некоторые типы укоротить его)вопросы, связанные с исходным кодом PHP uniqid()

//... 
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

Я не согласен с вами. Код не так уж трудно объяснить, но мне не хватает понимания о миллисекундном расчете природы. – Nick

+0

'Какая может быть причина' на самом деле не может быть ответом ни на что иное, кроме спекуляций, кроме самого писателя –

ответ

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 Он :) статистически корректен. – Blob

+0

Это не очень впечатляющий код, неважно, кто за него похваляется. –

Смежные вопросы