Генерировать случайную строку от 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 бит.