Al Random::alphanumericString($length)usarlo, puede obtener cadenas con 0-9a-zA-Z que se obtienen a partir de datos aleatorios criptográficamente seguros.
caw
Respuestas:
162
$rand = substr(md5(microtime()),rand(0,26),5);
Sería mi mejor suposición, a menos que también estés buscando caracteres especiales:
$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];
Nota: incremental significa más fácil de adivinar; Si está usando esto como una sal o un token de verificación, no lo haga. Una sal (ahora) de "WCWyb" significa que dentro de 5 segundos es "WCWyg")
md5()Sin embargo, el problema con el uso es que se obtiene una cadena formada por un conjunto de 16 caracteres (10 dígitos y ahasta f, es decir, 4 bits por carácter de cadena). Esto puede ser suficiente para algunos propósitos, pero puede ser muy poco para propósitos criptográficos (cinco caracteres de 16 símbolos = 16 ^ 5 = 20 bits = 1048576 posibilidades).
Arco
3
array_rand($seed, 5)devolverá la clave de la matriz, no el valor, por lo que su código no funcionará
alumi
1
Creo que usar una función hash criptográfica para generar caracteres aleatorios es al menos inapropiado.
gronostaj
¿Es posible también incluir ", 'como la barra inversa en $charset? ¿Necesito usar secuencias de escape para incluir esos caracteres?
mayo
1
El segundo fragmento ni siquiera usa el $lenparámetro de entrada ... ¿lo olvidó?
TechNyquist
76
Si forhay escasez de bucles, esto es lo que me gusta usar:
Solución interesante ... muy concisa, aunque me pregunto si esto es más rápido o más lento que usar for. Sin embargo, no puedo molestarme en realizar una evaluación comparativa :-)
@ user2826057: str_shuffle('ab')daría abo bapero nunca aa. Agregar el str_repeatpermite eso. Pero dicho esto, la solución que di no es realmente seria ... aunque funciona.
Matthew
2
Existe una posibilidad de 1/60466176 de que eso suceda, asumiendo que el RNG se distribuye uniformemente.
Mateo
1
Esto es perfecto para nuestro caso de uso de generar códigos de cupón. Hemos eliminado confundir caracteres, como l, i, 1, 0, O, etc, y de 500 vales conseguido sin duplicados.
Luke Cousins
25
Una forma rápida es utilizar los caracteres más volátiles del uniqid función .
Lo siguiente debería proporcionar la menor posibilidad de duplicación (es posible que desee reemplazar mt_rand()con una mejor fuente de números aleatorios, por ejemplo, desde /dev/*randomo desde GUID):
Primer ejemplo más inteligente con $ resultado. = $ Caracteres [mt_rand (0, strlen ($ caracteres) -1)]
hamboy75
En ese caso, debe determinar la longitud de antemano y almacenarla en una variable al menos. Usar strlen()en un bucle es una sobrecarga innecesaria, especialmente si ya sabe que el conjunto de caracteres no va a cambiar mientras tanto.
Arco
Lo dudo, php está optimizado, de todos modos es una opción :)
hamboy75
7
Siempre uso la misma función para esto, generalmente para generar contraseñas. Es fácil de usar y útil.
Creo que usar funciones hash es una exageración para una tarea tan simple como generar una secuencia de dígitos hexadecimales aleatorios. dechex+ mt_randhará el mismo trabajo, pero sin trabajo criptográfico innecesario. str_padgarantiza una longitud de 5 caracteres de la cadena de salida (si el número aleatorio es menor que 0x10000).
La probabilidad duplicada depende de mt_randla confiabilidad de. Mersenne Twister es conocido por su aleatoriedad de alta calidad, por lo que debería adaptarse bien a la tarea.
Tampoco supe cómo hacer esto hasta que pensé en usar PHP array. Y estoy bastante seguro de que esta es la forma más sencilla de generar una cadena o número aleatorio con matrices. El código:
Como señaló Archimedix , esto no garantizará la devolución de una "mínima posibilidad de duplicación", ya que el número de combinaciones es bajo para el rango de caracteres dado. Deberá aumentar el número de caracteres o permitir caracteres adicionales (especiales) en la cadena. Creo que la primera solución sería preferible en su caso.
El uso time()es hasta 1 millón de veces más predecible que microtime().
Arco
También tenga en cuenta mis comentarios a la respuesta de Brad, el problema más grande es que el hash generado es una representación hexadecimal que consta de 16 caracteres válidos, por lo que solo deja 1024 variaciones para $str.
Arco
@Archimedix, tal vez, pero el OP no pidió seguridad, la pregunta se definió para tener un algoritmo de generación de cadenas que consta de una combinación de 5x26 caracteres diferentes y evita los duplicados. Esto probablemente sea para un número de referencia de confirmación en un proceso de registro (o proceso de facturación), o algo así
Yanick Rochon
Tenía entendido que él hizo pedir menos posibilidad de ser duplicado , y esto tiene un 0,1% de probabilidad (1 en 1024) que podría haber sido casi 1 de 1 mil millones.
Arco
sin embargo, si necesita generar una clave de referencia de 5 caracteres y darle un cliente / cliente, no quiere darles " ˫§»⁋⅓" simplemente porque es más seguro ... aumenta su clave de referencia a 7 o más caracteres . (Por cierto: corrección en mi comentario anterior, son 5x36 caracteres)
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;}
La nueva función de PHP password_hash()(*> = PHP 5.5) está haciendo el trabajo para la generación de un conjunto de números y caracteres en mayúsculas y minúsculas decentemente largo.
Dos concat. las cadenas antes y después password_hashde la función $ random son adecuadas para el cambio.
Los parámetros para $random()* ($ a, $ b) son en realidad substr()parámetros. :)
NOTA: esto no necesita ser una función, también puede ser una variable normal ... como un singleliner desagradable, como este:
Consejo profesional: incluya una explicación sobre cómo su respuesta resuelve el problema del OP y por qué podría ser diferente a las otras respuestas ya proporcionadas.
0-9a-zA-Z
?Random::alphanumericString($length)
usarlo, puede obtener cadenas con 0-9a-zA-Z que se obtienen a partir de datos aleatorios criptográficamente seguros.Respuestas:
Sería mi mejor suposición, a menos que también estés buscando caracteres especiales:
Ejemplo
Y, para uno basado en el reloj (menos colisiones ya que es incremental):
Nota: incremental significa más fácil de adivinar; Si está usando esto como una sal o un token de verificación, no lo haga. Una sal (ahora) de "WCWyb" significa que dentro de 5 segundos es "WCWyg")
fuente
md5()
Sin embargo, el problema con el uso es que se obtiene una cadena formada por un conjunto de 16 caracteres (10 dígitos ya
hastaf
, es decir, 4 bits por carácter de cadena). Esto puede ser suficiente para algunos propósitos, pero puede ser muy poco para propósitos criptográficos (cinco caracteres de 16 símbolos = 16 ^ 5 = 20 bits = 1048576 posibilidades).array_rand($seed, 5)
devolverá la clave de la matriz, no el valor, por lo que su código no funcionará"
,'
como la barra inversa en$charset
? ¿Necesito usar secuencias de escape para incluir esos caracteres?$len
parámetro de entrada ... ¿lo olvidó?Si
for
hay escasez de bucles, esto es lo que me gusta usar:fuente
str_shuffle('ab')
daríaab
oba
pero nuncaaa
. Agregar elstr_repeat
permite eso. Pero dicho esto, la solución que di no es realmente seria ... aunque funciona.l
,i
,1
,0
,O
, etc, y de 500 vales conseguido sin duplicados.Una forma rápida es utilizar los caracteres más volátiles del uniqid función .
Por ejemplo:
fuente
Puedes probarlo simplemente así:
más detalles: http://forum.arnlweb.com/viewtopic.php?f=7&t=25
fuente
Lo siguiente debería proporcionar la menor posibilidad de duplicación (es posible que desee reemplazar
mt_rand()
con una mejor fuente de números aleatorios, por ejemplo, desde/dev/*random
o desde GUID):EDITAR:
Si le preocupa la seguridad, en realidad, no use
rand()
omt_rand()
, y verifique que su dispositivo de datos aleatorios sea en realidad un dispositivo que genera datos aleatorios , no un archivo normal o algo predecible como/dev/zero
.mt_rand()
considerado dañino:https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php
EDITAR: Si tiene soporte para OpenSSL en PHP, puede usar
openssl_random_pseudo_bytes()
:fuente
strlen()
en un bucle es una sobrecarga innecesaria, especialmente si ya sabe que el conjunto de caracteres no va a cambiar mientras tanto.Siempre uso la misma función para esto, generalmente para generar contraseñas. Es fácil de usar y útil.
fuente
Parece que str_shuffle sería un buen uso para esto. Siembra la mezcla con los personajes que quieras.
fuente
fuente
Si está bien que solo obtenga letras AF, aquí está mi solución:
Creo que usar funciones hash es una exageración para una tarea tan simple como generar una secuencia de dígitos hexadecimales aleatorios.
dechex
+mt_rand
hará el mismo trabajo, pero sin trabajo criptográfico innecesario.str_pad
garantiza una longitud de 5 caracteres de la cadena de salida (si el número aleatorio es menor que 0x10000).La probabilidad duplicada depende de
mt_rand
la confiabilidad de. Mersenne Twister es conocido por su aleatoriedad de alta calidad, por lo que debería adaptarse bien a la tarea.fuente
Tampoco supe cómo hacer esto hasta que pensé en usar PHP
array
. Y estoy bastante seguro de que esta es la forma más sencilla de generar una cadena o número aleatorio con matrices. El código:Puedes usar esta función así
fuente
Similar a la respuesta de Brad Christie , pero usando un
sha1
algoritmo para los caracteres0-9a-zA-Z
y prefijado con un valor aleatorio:Pero si ha establecido caracteres definidos (permitidos):
** ACTUALIZAR **
Como señaló Archimedix , esto no garantizará la devolución de una "mínima posibilidad de duplicación", ya que el número de combinaciones es bajo para el rango de caracteres dado. Deberá aumentar el número de caracteres o permitir caracteres adicionales (especiales) en la cadena. Creo que la primera solución sería preferible en su caso.
fuente
time()
es hasta 1 millón de veces más predecible quemicrotime()
.$str
.˫§»⁋⅓
" simplemente porque es más seguro ... aumenta su clave de referencia a 7 o más caracteres . (Por cierto: corrección en mi comentario anterior, son 5x36 caracteres)funciona bien en PHP (php 5.4.4)
Demo en vivo
fuente
Fuente: Función PHP que genera caracteres aleatorios
Esta sencilla función de PHP funcionó para mí:
Uso:
fuente
Aquí están mis
random 5 cents
...La nueva función de PHP
password_hash()
(*> = PHP 5.5) está haciendo el trabajo para la generación de un conjunto de números y caracteres en mayúsculas y minúsculas decentemente largo.Dos concat. las cadenas antes y después
password_hash
de la función $ random son adecuadas para el cambio.Los parámetros para
$random()
* ($ a, $ b) son en realidadsubstr()
parámetros. :)NOTA: esto no necesita ser una función, también puede ser una variable normal ... como un singleliner desagradable, como este:
fuente
fuente
Siempre he usado esto:
Cuando lo llama, establece la longitud de la cuerda.
También puede cambiar los posibles caracteres de la cadena
$a
.fuente