Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Генерация строки и шаблон под неё
Форумы портала PHP.SU » » Вопросы новичков » Генерация строки и шаблон под неё

Страниц (1): [1]
 

1. improbable - 28 Мая, 2013 - 13:26:43 - перейти к сообщению
Помогите средствами PHP сгенерировать строку, состоящую из 32-х случайных буквенно-числовых символов верхнего и нижнего регистра. Моё решение получается слишком большим Улыбка

Под такую строку я подобрал шаблон регулярного выражения..



Правильно, или есть неточности?
2. DeepVarvar - 28 Мая, 2013 - 13:30:50 - перейти к сообщению
3. improbable - 28 Мая, 2013 - 13:32:13 - перейти к сообщению

так я делал, но md5 не возвращает букв верхнего регистра
4. DeepVarvar - 28 Мая, 2013 - 13:35:11 - перейти к сообщению
Тебе шашечки или ехать?
Они все уникальны и их не угадаешь.
5. improbable - 28 Мая, 2013 - 13:37:45 - перейти к сообщению
DeepVarvar пишет:
Тебе шашечки или ехать?
Они все уникальны и их не угадаешь.

угадать то не угадаешь, но подбор они сделают невозможным. лучше всё-таки с большими буквами
6. EuGen - 28 Мая, 2013 - 13:46:21 - перейти к сообщению
php>=5.4
PHP:
скопировать код в буфер обмена
  1. $iLength = 32;
  2. $sResult = join('', array_map(function($sChr)
  3. {
  4.    return array_merge(range('A','Z'), range('a','z'), range(0, 9))[rand(0, 61)];
  5. }, array_fill(0, $iLength, '')));
  6. //var_dump($sResult);

?
7. improbable - 28 Мая, 2013 - 13:52:21 - перейти к сообщению
EuGen пишет:
php>=5.4
PHP:
скопировать код в буфер обмена
  1. $iLength = 32;
  2. $sResult = join('', array_map(function($sChr)
  3. {
  4.    return array_merge(range('A','Z'), range('a','z'), range(0, 9))[rand(0, 61)];
  5. }, array_fill(0, $iLength, '')));
  6. //var_dump($sResult);

?

да, оно, спасибо большое Улыбка
8. DeepVarvar - 28 Мая, 2013 - 14:04:27 - перейти к сообщению
Тогда уж для php 5.3 и ниже:
PHP:
скопировать код в буфер обмена
  1. $s = array_merge(range("A", "Z"), range("a", "z"), range(0, 9));
  2. shuffle($s);
  3. echo join("", array_slice($s, 0, 32)) . PHP_EOL;

(Добавление)
Но это все не случайные строки.
Могут быть коллизии.
(Добавление)
С меньшим числом коллизий вот, что первое в голову пришло:
PHP:
скопировать код в буфер обмена
  1. $w = substr(base64_encode(md5(mt_rand() . microtime(true))), 0, -2);
  2. preg_match_all("/\d/", md5(mt_rand() . microtime(true)), $n);
  3. $s = array_merge($n[0], preg_split("//", $w));
  4. shuffle($s);
  5. echo join("", array_slice($s, 0, 32)) . PHP_EOL;

Не очень..
9. EuGen - 28 Мая, 2013 - 14:11:16 - перейти к сообщению
DeepVarvar пишет:
Тогда уж для php 5.3 и ниже:

Плохо тем, что каждый символ может встречаться только 1 раз. Хотя, с другой стороны, C6232 - большое число.
10. improbable - 28 Мая, 2013 - 14:30:05 - перейти к сообщению
От себя, как вариант

PHP:
скопировать код в буфер обмена
  1. function new_char() {
  2.     $char_type = rand(1, 3);
  3.         switch ($char_type) {
  4.             case 1:
  5.                 $char = mt_rand(0, 9);
  6.                 break;
  7.             case 2:
  8.                 $array = range('A', 'Z');
  9.                 $rand_keys = array_rand ($array);
  10.                 $char = $array[$rand_keys];
  11.                 break;
  12.             case 3:
  13.                 $array = range('a', 'z');
  14.                 $rand_keys = array_rand ($array);
  15.                 $char = $array[$rand_keys];
  16.                 break;
  17.         }
  18.     echo $char;
  19. }
  20.  
  21. while ($i++ < 32) {
  22.     new_char();
  23. }
11. DelphinPRO - 28 Мая, 2013 - 14:38:27 - перейти к сообщению
improbable пишет:
угадать то не угадаешь, но подбор они сделают невозможным

какой подбор? о чем вы?
вы в курсе, сколько нужно ресурсов для подбора MD5 хеша?

PS для большей уникальности можно использовать sha1

ну а вообще для генерации уникальной строки достаточно функции uniqid которая генерирует уникальную строку на основе current time длиной 13 или 23 символа, в зависимости от параметра. И незачем выдумывать велики.

 

Powered by ExBB FM 1.0 RC1