Генерировать случайную строку от 4 до 8 символов в PHP
Мне нужно создать строку с использованием PHP, нужна, чтобы быть уникальной, а нужна - от 4 до 8 символов (значение переменной). p >
Я думал, что могу использовать хеш 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);
Как вы думаете, я получаю уникальную строку каждый раз для goood, пока?
Ответы
Ответ 1
Короче говоря, я думаю, вы получите довольно хорошее случайное значение. Всегда есть вероятность столкновения, но вы сделали все возможное, чтобы получить случайное значение. uniqid() возвращает случайное значение, основанное на текущем времени в микросекундах. Задание rand() (mt_rand() будет лучше), а второй аргумент как true для uniqid() должен сделать значение еще более уникальным. Хеширование значения с помощью md5() также должно сделать его довольно уникальным, поскольку даже небольшая разница в двух генерируемых случайных значениях должна быть увеличена с помощью функции хэширования. idealmachine верна в том, что более длинное значение с меньшей вероятностью имеет столкновение, чем более короткое.
Ваша функция также может быть короче, так как md5() всегда возвращает строку длиной 32 символа. Попробуйте следующее:
function unique_id($l = 8) {
return substr(md5(uniqid(mt_rand(), true)), 0, $l);
}
Ответ 2
Проблема со случайностью заключается в том, что вы никогда не можете быть уверены в чем-либо. Есть небольшой шанс, что вы можете получить один номер на этот раз и тот же номер следующий. Тем не менее, вы хотели бы сделать строку как можно дольше, чтобы уменьшить эту вероятность. В качестве примера того, как долго могут быть такие цифры, GUID (глобально уникальные идентификаторы) имеют длину 16 байтов.
В теории четыре шестнадцатеричных символа (16 бит) дают только 16 ^ 4 = 65536 возможностей, а восемь шестнадцатеричных символов (32 бита) дают 16 ^ 8 = 4294967296. Вам, однако, нужно подумать о том, насколько вероятно это для любого два хеша для столкновения ( "проблема дня рождения" ). В Википедии есть хорошая таблица о вероятности такого столкновения. Короче говоря, четыре шестнадцатеричных символа определенно недостаточны, а восемь не могут быть.
Возможно, вам захочется использовать кодировку Base64, а не шестую цифру; Таким образом, вы можете поместить 48 бит, а не только 32 бита.
Восемь байтов - 8 * 8 = 64 бит.