Почему делает PHPs uniqid, функционируют, возвращают только 13 цифр а не 14?

uniqid() функционируйте возвращает 13 цифры длинное шестнадцатеричное количество. Согласно спецификации в сайте php.net, функциональном использовании microtime сгенерировать уникальное значение.

Но microtime числа возвратов в формате строки как следующий:

"0.70352700 12689396875"

которые являются в основном микросекундами, и секунды протекли с 1970. Это - 9+11 десятичных чисел цифр.

Преобразование 20 десятичных чисел в шестнадцатеричное число привело бы к 16 цифры, шестнадцатеричные НЕ 13 цифры один.

Я также думавший вынуть "0". часть, которые, кажется, никогда не изменяются, и последние две цифры части микросекунды, которые, кажется, всегда остаются "00". Выполнение этого, десятичное число было бы только 9+11-3 цифрами долго, но все еще десятичное число 17 цифр при преобразовании в шестнадцатеричное число приведет к 14 цифрам шестнадцатеричное число НЕ 13.

Я не ИНТЕРЕСУЮСЬ ПОЛУЧЕНИЕМ УНИКАЛЬНОГО ИДЕНТИФИКАТОРА В ДРУГОМ ОТНОШЕНИИ ИЛИ БОЛЕЕ ДЛИННОГО/КОРОЧЕ УНИКАЛЬНОГО ИДЕНТИФИКАТОРА! Я ТОЛЬКО СПРАШИВАЮ, ЗНАЕТ ли КТО-ТО, ПОЧЕМУ ДЕЛАЕТ ВОЗВРАТЫ uniqid ТОЛЬКО 13 ЦИФР.

Это кажется nosense: если uniqid возвраты одна цифра меньше, чем microtime, это означает это microtime выделяет результаты, которые более уникальны из тех возвращенных uniqid.

10
задан Martin Thoma 14 May 2014 в 18:33
поделиться

4 ответа

Нашел на http://www.php.net/manual/en/function.uniqid.php#95001

Имеет смысл мне. Прокомментируйте, если вам нужно объяснение

Для записи, базовая функция для uniqid () выглядит примерно следующим образом:

$ m = microtime (true); {{ 1}} sprintf ("% 8x% 05x \ n", floor ($ m), ($ m-floor ($ m)) * 1000000);

Другими словами, первые 8 шестнадцатеричных символов = {{1} } Unixtime, последние 5 шестнадцатеричных символов = микросекунд. Вот почему его точность составляет микросекунды. Кроме того, он предоставляет средства для обратного проектирования времени, когда был сгенерирован uniqid:

date ("r", hexdec (substr (uniqid ( ), 0,8)));

По мере того, как вы спускаетесь вниз по строке, число со временем становится "более уникальным", за исключением цифра 9, где числовое значение равно 0..3> 4> 5..f из-за разницы между 10 ^ 6 и 16 ^ 5 (это предположительно верно и для остальных цифр, но гораздо менее заметных).

20
ответ дан 3 December 2019 в 15:51
поделиться

Я думаю, что число, сгенерированное uniqid , равно на основе текущего времени в микросекундах - но это не то время: расчет, вероятно, немного сложнее, чем вы думаете.

Тем не менее, если вам нужно более 13 цифр, вы можете передать true в качестве второго параметра в uniqid , чтобы получить больше энтропии - и это даст вам строку это 23 символа.


Например, с этой частью кода:

var_dump(uniqid());
var_dump(uniqid('', true));

Я только что получил:

string '4ba284384e4ca' (length=13)
string '4ba284384e4df9.73439132' (length=23)
8
ответ дан 3 December 2019 в 15:51
поделиться

Для уникального идентификатора из 32 символов попробуйте следующее:

$unique = uniqid(rand(), true);

Чтобы сократить его, просто используйте substr ():

$unique = substr(uniqid(rand(), true), 16, 16); // 16 characters long
2
ответ дан 3 December 2019 в 15:51
поделиться

Согласно руководству по PHP, значение по умолчанию - 13, а для $ more_entropy установлено значение true, это будет 23, но вы всегда будете иметь временную метку Unix.

Я часто использую $ uid = md5 (uniqid ());

Обновление:
Теперь это даст вам 32 символа с минимальной вероятностью столкновения в этом времени жизни.

md5(uniqid(mt_rand(), true)); 
-3
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: