Используя, Random::alphanumericString($length)вы можете получить строки с 0-9a-zA-Z, которые получены из криптографически безопасных случайных данных.
каркать
Ответы:
162
$rand = substr(md5(microtime()),rand(0,26),5);
Было бы лучше всего предположить - если вы тоже не ищете специальных символов:
$seed = str_split('abcdefghijklmnopqrstuvwxyz'.'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.'0123456789!@#$%^&*()');// and any other characters
shuffle($seed);// probably optional since array_is randomized; this may be redundant
$rand ='';foreach(array_rand($seed,5)as $k) $rand .= $seed[$k];
Примечание: инкрементальный означает, что угадать легче; Если вы используете это как соль или токен подтверждения, не делайте этого. Соль (сейчас) «WCWyb» означает, что через 5 секунд это «WCWyg»)
Однако проблема с использованием md5()состоит в том, что вы получаете строку, состоящую из 16-значного набора (10 цифр и aдо f, т.е. 4 бита на строковый символ). Этого может быть достаточно для некоторых целей, но может быть слишком мало для криптографических целей (пять символов из 16 символов = 16 ^ 5 = 20 бит = 1048576 возможных вариантов).
Arc
3
array_rand($seed, 5)вернет ключ массива, а не значение, поэтому ваш код не будет работать
alumi
1
Я считаю, что использование криптографической хеш-функции для генерации случайных символов как минимум неуместно.
gronostaj
Можно также включить ", 'и обратный слэш в $charset? Нужно ли мне использовать escape-последовательности для включения этих символов?
Май
1
Второй фрагмент даже не использует параметр $lenввода ... вы его забыли?
TechNyquist
77
Если forпетель не хватает, я люблю использовать вот что:
Интересное решение ... очень краткое, хотя мне интересно, быстрее это или медленнее, чем при использовании for. Хотя не беспокойтесь о тестировании :-)
Arc
@matthew str_shuffle будет постоянно создавать дубликаты
SCC
@ user2826057: str_shuffle('ab')даст abили, baно никогда aa. Добавление str_repeatпозволяет для этого. Но, тем не менее, решение, которое я дал, на самом деле не является серьезным ... хотя оно действительно работает.
Мэтью
2
Вероятность того, что это произойдет, составляет 1/60466176, если ГСЧ распределен равномерно.
Мэтью
1
Это идеально подходит для нашего случая создания кодов ваучера. Мы удалили запутанные символы, как l, i, 1, 0, O, и т.д. , и из 500 ваучеров не получили дубликатов.
Люк Казинс
25
Самый быстрый способ - использовать самые изменчивые символы функции uniqid .
Следующее должно обеспечить наименьшую вероятность дублирования (вы можете захотеть заменить mt_rand()его более подходящим источником случайных чисел, например, из /dev/*randomили из GUID):
Первый пример более умный с $ result. = $ Characters [mt_rand (0, strlen ($ characters) -1)]
hamboy75 05
В этом случае вам следует заранее определить длину и сохранить ее как минимум в переменной. Использование strlen()в цикле не требует дополнительных затрат, особенно если вы уже знаете, что набор символов тем временем не изменится.
Arc
Сомневаюсь, php оптимизирован, в любом случае это вариант :)
hamboy75
7
Я всегда использую для этого одну и ту же функцию, обычно для генерации паролей. Это удобно и полезно.
Я считаю, что использование хеш-функций является излишним для такой простой задачи, как генерация последовательности случайных шестнадцатеричных цифр. dechex+ mt_randвыполнит ту же работу, но без лишней криптографической работы. str_padгарантирует длину выходной строки 5 символов (если случайное число меньше 0x10000).
Вероятность повторения зависит от mt_randнадежности России. Mersenne Twister известен качественной случайностью, поэтому он должен хорошо соответствовать задаче.
Я также не знал, как это сделать, пока не подумал об использовании PHP array. И я почти уверен, что это простейший способ создания случайной строки или числа с помощью массива. Код:
Как указал Archimedix , это не гарантирует возврата «наименьшей вероятности дублирования», так как количество комбинаций для данного диапазона символов мало. Вам нужно будет либо увеличить количество символов, либо разрешить дополнительные (специальные) символы в строке. Думаю, в вашем случае первое решение было бы предпочтительнее.
Использование time()до 1 миллиона раз более предсказуемо, чем microtime().
Arc
Также обратите внимание на мои комментарии к ответу Брэда, более серьезная проблема заключается в том, что сгенерированный хеш является шестнадцатеричным представлением, состоящим из 16 действительных символов, поэтому остается только 1024 варианта для $str.
Arc
@Archimedix, возможно, но OP не требовал безопасности, вопрос был определен, чтобы иметь алгоритм генерации строки, состоящий из комбинации 5x26 разных символов, и избегая дублирования. Вероятно, это для ссылочного номера подтверждения в процессе регистрации (или в процессе выставления счетов) или чего-то
подобного
Насколько я понимаю, он действительно просил о наименьшей возможности дублирования , и это имеет вероятность 0,1% (1 из 1024), что могло быть почти 1 из 1 миллиарда.
Arc
однако, если вам нужно сгенерировать ссылочный ключ из 5 символов и предоставить вам клиента / покупателя, вы не хотите давать им " ˫§»⁋⅓" просто потому, что это более безопасно ... вы увеличиваете ссылочный ключ до 7 или более символов . (Кстати: исправление в моем предыдущем комментарии, это 5x36 символов)
function cvf_ps_generate_random_code($length=10){
$string ='';// You can define your own characters here.
$characters ="23456789ABCDEFHJKLMNPRTVWXYZabcdefghijklmnopqrstuvwxyz";for($p =0; $p < $length; $p++){
$string .= $characters[mt_rand(0, strlen($characters)-1)];}return $string;}
0-9a-zA-Z
?Random::alphanumericString($length)
вы можете получить строки с 0-9a-zA-Z, которые получены из криптографически безопасных случайных данных.Ответы:
Было бы лучше всего предположить - если вы тоже не ищете специальных символов:
пример
И для одного, основанного на часах (меньше столкновений, поскольку оно увеличивается):
Примечание: инкрементальный означает, что угадать легче; Если вы используете это как соль или токен подтверждения, не делайте этого. Соль (сейчас) «WCWyb» означает, что через 5 секунд это «WCWyg»)
источник
md5()
состоит в том, что вы получаете строку, состоящую из 16-значного набора (10 цифр иa
доf
, т.е. 4 бита на строковый символ). Этого может быть достаточно для некоторых целей, но может быть слишком мало для криптографических целей (пять символов из 16 символов = 16 ^ 5 = 20 бит = 1048576 возможных вариантов).array_rand($seed, 5)
вернет ключ массива, а не значение, поэтому ваш код не будет работать"
,'
и обратный слэш в$charset
? Нужно ли мне использовать escape-последовательности для включения этих символов?$len
ввода ... вы его забыли?Если
for
петель не хватает, я люблю использовать вот что:источник
str_shuffle('ab')
дастab
или,ba
но никогдаaa
. Добавлениеstr_repeat
позволяет для этого. Но, тем не менее, решение, которое я дал, на самом деле не является серьезным ... хотя оно действительно работает.l
,i
,1
,0
,O
, и т.д. , и из 500 ваучеров не получили дубликатов.Самый быстрый способ - использовать самые изменчивые символы функции uniqid .
Например:
источник
Вы можете попробовать это просто так:
подробнее: http://forum.arnlweb.com/viewtopic.php?f=7&t=25
источник
Следующее должно обеспечить наименьшую вероятность дублирования (вы можете захотеть заменить
mt_rand()
его более подходящим источником случайных чисел, например, из/dev/*random
или из GUID):РЕДАКТИРОВАТЬ:
Если вас беспокоит безопасность, на самом деле не используйте
rand()
илиmt_rand()
и убедитесь, что ваше устройство случайных данных на самом деле является устройством, генерирующим случайные данные, а не обычным файлом или чем-то предсказуемым/dev/zero
.mt_rand()
считается вредным:https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php
EDIT: если у вас есть поддержка OpenSSL в PHP, вы можете использовать
openssl_random_pseudo_bytes()
:источник
strlen()
в цикле не требует дополнительных затрат, особенно если вы уже знаете, что набор символов тем временем не изменится.Я всегда использую для этого одну и ту же функцию, обычно для генерации паролей. Это удобно и полезно.
источник
Похоже, для этого подойдет str_shuffle . Заполните перемешанный список любыми персонажами, которые хотите.
источник
источник
Если нормально, что вы получите только буквы AF, то вот мое решение:
Я считаю, что использование хеш-функций является излишним для такой простой задачи, как генерация последовательности случайных шестнадцатеричных цифр.
dechex
+mt_rand
выполнит ту же работу, но без лишней криптографической работы.str_pad
гарантирует длину выходной строки 5 символов (если случайное число меньше 0x10000).Вероятность повторения зависит от
mt_rand
надежности России. Mersenne Twister известен качественной случайностью, поэтому он должен хорошо соответствовать задаче.источник
Я также не знал, как это сделать, пока не подумал об использовании PHP
array
. И я почти уверен, что это простейший способ создания случайной строки или числа с помощью массива. Код:Вы можете использовать эту функцию так
источник
Подобно ответу Брэда Кристи , но с использованием
sha1
алгоритма для символов0-9a-zA-Z
и префикса со случайным значением:Но если вы установили определенные (разрешенные) символы:
** ОБНОВЛЕНИЕ **
Как указал Archimedix , это не гарантирует возврата «наименьшей вероятности дублирования», так как количество комбинаций для данного диапазона символов мало. Вам нужно будет либо увеличить количество символов, либо разрешить дополнительные (специальные) символы в строке. Думаю, в вашем случае первое решение было бы предпочтительнее.
источник
time()
до 1 миллиона раз более предсказуемо, чемmicrotime()
.$str
.˫§»⁋⅓
" просто потому, что это более безопасно ... вы увеличиваете ссылочный ключ до 7 или более символов . (Кстати: исправление в моем предыдущем комментарии, это 5x36 символов)отлично работает в PHP (php 5.4.4)
Живая демонстрация
источник
Источник: функция PHP, которая генерирует случайные символы
У меня сработала эта простая функция PHP:
Использование:
источник
Вот мои
random 5 cents
...Новая
password_hash()
функция PHP (*> = PHP 5.5) выполняет работу по генерации прилично длинного набора символов и чисел в верхнем и нижнем регистре.Два конкат. строки до и после
password_hash
в функции $ random подходят для изменения.Параметры для
$random()
* ($ a, $ b) на самом деле являютсяsubstr()
параметрами. :)ПРИМЕЧАНИЕ: это не обязательно должна быть функция, это может быть и обычная переменная ... как один неприятный однострочный элемент, например:
источник
источник
Я всегда использую это:
Когда вы его вызываете, устанавливает длину строки.
Вы также можете изменить возможные символы в строке
$a
.источник