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
.
Нашел на 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 (это предположительно верно и для остальных цифр, но гораздо менее заметных).
Я думаю, что число, сгенерированное uniqid
, равно на основе текущего времени в микросекундах - но это не то время: расчет, вероятно, немного сложнее, чем вы думаете.
Тем не менее, если вам нужно более 13 цифр, вы можете передать true
в качестве второго параметра в uniqid
, чтобы получить больше энтропии - и это даст вам строку это 23 символа.
Например, с этой частью кода:
var_dump(uniqid());
var_dump(uniqid('', true));
Я только что получил:
string '4ba284384e4ca' (length=13)
string '4ba284384e4df9.73439132' (length=23)
Для уникального идентификатора из 32 символов попробуйте следующее:
$unique = uniqid(rand(), true);
Чтобы сократить его, просто используйте substr ():
$unique = substr(uniqid(rand(), true), 16, 16); // 16 characters long
Согласно руководству по PHP, значение по умолчанию - 13, а для $ more_entropy установлено значение true, это будет 23, но вы всегда будете иметь временную метку Unix.
Я часто использую $ uid = md5 (uniqid ());
Обновление:
Теперь это даст вам 32 символа с минимальной вероятностью столкновения в этом времени жизни.
md5(uniqid(mt_rand(), true));