Генерация случайных строк от 4 до 8 символов в PHP

мне нужно сгенерировать строку с помощью 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);

Как вы думаете, я буду получать уникальную строку каждый раз для goood в то время как?

3 ответов


короче говоря, я думаю, вы получите довольно хорошее случайное значение. Всегда есть вероятность столкновения, но вы сделали все возможное, чтобы получить случайное значение. 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. Вам, однако, нужно учитывать, насколько это вероятно для любой два хэша для столкновения ("проблема дня рождения"). Википедия имеет хороший стол о том, насколько вероятно такое столкновение. Короче говоря, четырех шестнадцатеричных символов определенно недостаточно, а восьми может и не хватить.

вы можете рассмотреть возможность использования кодировки Base64, а не шестнадцатеричных цифр; таким образом, вы можете поместить 48 бит, а не только 32 биты.

восемь байт-это 8 * 8 = 64 бита.


надежные пароли вы можете сделать только из ascii символы a-zA-Z и цифры 0-9. Для этого лучше всего использовать только криптографически безопасные методы, такие как random_int() или random_bytes() от PHP7. Остальные функции как base64_encode () вы можете использовать только в качестве функций поддержки, чтобы сделать надежность строки и изменить ее на ASCII письмена.

mt_rand () не является безопасным и очень старым. Из любой строки, вы должны использовать random_int(). Из двоичной строки, вы должны использовать base64_encode () чтобы сделать двоичную строку надежной или bin2hex, но тогда вы сократите байт только до 16 позиций (значений). см. мою реализацию этих функций.