Генерация случайной строки от 4 до 8 символов в PHP - PullRequest
17 голосов
/ 17 октября 2010

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

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

Ответы [ 3 ]

46 голосов
/ 17 октября 2010

Короче говоря, я думаю, вы получите довольно хорошее случайное значение.Всегда есть вероятность столкновения, но вы сделали все возможное, чтобы получить случайное значение.uniqid () возвращает случайное значение, основанное на текущем времени в микросекундах.Указание rand () (лучше будет mt_rand ()) и второй аргумент как true для uniqid () должны сделать значение еще более уникальным.Хэширование значения с использованием md5 () также должно сделать его довольно уникальным, поскольку даже небольшая разница в двух генерируемых случайных значениях должна быть увеличена функцией хеширования.idealmachine верен в том, что более длинное значение с меньшей вероятностью будет иметь конфликт, чем более короткое.

Ваша функция также может быть короче, поскольку md5 () всегда будет возвращать строку длиной 32 символа.Попробуйте это:

function unique_id($l = 8) {
    return substr(md5(uniqid(mt_rand(), true)), 0, $l);
}
3 голосов
/ 17 октября 2010

Проблема со случайностью заключается в том, что вы никогда не можете быть уверены ни в чем. Существует небольшая вероятность того, что в этот раз вы можете получить один номер, а следующий - тот же номер. Тем не менее, вы хотели бы сделать строку как можно дольше, чтобы уменьшить эту вероятность. В качестве примера того, как долго могут быть такие числа, GUID (глобально уникальные идентификаторы) имеют длину 16 байтов.

Теоретически, четыре шестнадцатеричных символа (16 бит) дают только 16 ^ 4 = 65536 возможностей, в то время как восемь шестнадцатеричных символов (32 бита) дают 16 ^ 8 = 4294967296. Вам, однако, нужно подумать, насколько это вероятно для любой два хеша для столкновения («проблема дня рождения»). В Википедии есть хорошая таблица о вероятности такого столкновения. Короче говоря, четырех шестнадцатеричных символов явно недостаточно, а восемь может и не быть.

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

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

0 голосов
/ 01 мая 2018

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

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

...