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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
improbable
Отправлено: 28 Мая, 2013 - 13:26:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




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

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



Правильно, или есть неточности?
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Мая, 2013 - 13:30:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




 
 Top
improbable
Отправлено: 28 Мая, 2013 - 13:32:13
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)





так я делал, но md5 не возвращает букв верхнего регистра
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Мая, 2013 - 13:35:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Тебе шашечки или ехать?
Они все уникальны и их не угадаешь.
 
 Top
improbable
Отправлено: 28 Мая, 2013 - 13:37:45
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




DeepVarvar пишет:
Тебе шашечки или ехать?
Они все уникальны и их не угадаешь.

угадать то не угадаешь, но подбор они сделают невозможным. лучше всё-таки с большими буквами
 
 Top
EuGen Администратор
Отправлено: 28 Мая, 2013 - 13:46:21
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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);

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
improbable
Отправлено: 28 Мая, 2013 - 13:52:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




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);

?

да, оно, спасибо большое Улыбка
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Мая, 2013 - 14:04:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Тогда уж для 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;

Не очень..
 
 Top
EuGen Администратор
Отправлено: 28 Мая, 2013 - 14:11:16
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar пишет:
Тогда уж для php 5.3 и ниже:

Плохо тем, что каждый символ может встречаться только 1 раз. Хотя, с другой стороны, C6232 - большое число.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
improbable
Отправлено: 28 Мая, 2013 - 14:30:05
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Февр. 2012  


Помог: 0 раз(а)




От себя, как вариант

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. }

(Отредактировано автором: 28 Мая, 2013 - 14:30:46)

 
 Top
DelphinPRO
Отправлено: 28 Мая, 2013 - 14:38:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




improbable пишет:
угадать то не угадаешь, но подбор они сделают невозможным

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

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

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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB