Мне нужно сгенерировать строку с использованием PHP, она должна быть уникальной и должна иметь от 4 до 8 символов (значение переменной).
Я думал, что могу использовать хеш crc32, но я не могу решить, сколько персонажей, но уверен, что он будет уникальным. С другой стороны, только создание «генератора паролей» будет генерировать дублируемую строку, и проверка значения в таблице для каждой строки займет некоторое время.
Как я могу это сделать?
Может быть, я могу использовать это:
function unique_id(){ $better_token = md5(uniqid(rand(), true)); $unique_code = substr($better_token, 16); $uniqueid = $unique_code; return $uniqueid; } $id = unique_id();
Переход на:
function unique_id($l = 8){ $better_token = md5(uniqid(rand(), true)); $rem = strlen($better_token)-$l; $unique_code = substr($better_token, 0, -$rem); $uniqueid = $unique_code; return $uniqueid; } echo unique_id(4);
Как вы думаете, я получаю уникальную строку каждый раз для гудов?
Короче говоря, я думаю, вы получите довольно хорошее случайное значение. Всегда есть вероятность столкновения, но вы сделали все возможное, чтобы получить случайное значение. uniqid () возвращает случайное значение, основанное на текущем времени в микросекундах. Задание rand () (mt_rand () будет лучше), а второй аргумент как true для uniqid () должен сделать значение еще более уникальным. Хеширование значения с помощью md5 () также должно сделать его довольно уникальным, поскольку даже небольшая разница в двух генерируемых случайных значениях должна быть увеличена с помощью функции хэширования. idealmachine верна в том, что более длинное значение с меньшей вероятностью имеет столкновение, чем более короткое.
Ваша функция также может быть короче, так как md5 () всегда возвращает строку длиной 32 символа. Попробуй это:
function unique_id($l = 8) { return substr(md5(uniqid(mt_rand(), true)), 0, $l); }
Проблема со случайностью заключается в том, что вы никогда не можете быть уверены в чем-либо. Есть небольшой шанс, что вы можете получить один номер на этот раз и тот же номер следующий. Тем не менее, вы хотели бы сделать строку как можно дольше, чтобы уменьшить эту вероятность. В качестве примера того, как долго могут быть такие числа, GUID (глобально уникальные идентификаторы) имеют длину 16 байт.
Теоретически четыре шестнадцатеричных символа (16 бит) дают только 16 ^ 4 = 65536 возможностей, а восемь шестнадцатеричных символов (32 бита) дают 16 ^ 8 = 4294967296. Вам, однако, нужно рассмотреть, насколько вероятно, что для любых двух хэшей collide («проблема с днем рождения»). В Википедии есть хорошая таблица о том, насколько вероятно такое столкновение. Короче говоря, четыре шестнадцатеричных символа определенно не достаточны, а восемь – не могут быть.
Возможно, вы захотите использовать кодировку Base64, а не шестую цифру; Таким образом, вы можете поместить 48 бит, а не только 32 бита.
Восемь байтов – 8 * 8 = 64 бит.