Foros del Web » Programando para Internet » PHP »

Generar ID alfanumérico

Estas en el tema de Generar ID alfanumérico en el foro de PHP en Foros del Web. Buenas.. Estoy haciendo una aplicación.. en la cual necesito generar ID alfanuméricos.. Busqué en internet.. pero todo lo que encontré fue.. hacerlo con por ejemplo ...
  #1 (permalink)  
Antiguo 13/07/2011, 22:01
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Pregunta Generar ID alfanumérico

Buenas..

Estoy haciendo una aplicación.. en la cual necesito generar ID alfanuméricos..

Busqué en internet.. pero todo lo que encontré fue.. hacerlo con por ejemplo md5.. u otros tipos de hash.. pero no quiero que quede tan largo :S

quiero que sea una id similar a la de youtube.. google url shortener o algo asi...


Bueno, gracias por la visita

saludos! :)
  #2 (permalink)  
Antiguo 13/07/2011, 22:42
marcofbb
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Generar ID alfanumérico

podes usar rand y arrays o podes usar md5 y acortar la cantidad de palabras, ojo ya no seria mas md5 pero si lo podes usar para generar letras y numeros

saludos
  #3 (permalink)  
Antiguo 13/07/2011, 22:58
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Generar ID alfanumérico

El que busca encuentra....

Contraseñas numéricas o alfanuméricas
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #4 (permalink)  
Antiguo 13/07/2011, 23:00
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Generar ID alfanumérico

Hola marcofbb.. gracias por responder..

Me podrias explicar un poco como seria el tema de rand y arrays??

y.. con el tema de md5 y acortar el string.. con eso no me estoy arriesgando mucho a que se repitan los ID generados??

Saludos! :)
  #5 (permalink)  
Antiguo 13/07/2011, 23:01
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Generar ID alfanumérico

hola nemutagk, gracias por la respuesta

cai en el código que me pasaste.. te aseguro que busqué mucho..

pero ese código sirve para generar passwords automáticos.. que probablemente se repitan...

Sirve mas que nada para generar un password cuando un usuario nuevo se registre... obvio.. es asi como lo entendi yo

saludos!
  #6 (permalink)  
Antiguo 13/07/2011, 23:14
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Generar ID alfanumérico

Estas bromeando verdad...

Si comprendes que aunque la función diga que es una "contraseña" al final de cuentas es un string alfanumérico?....

Ahora, por algo se llama ingeniería, porque no toda función va a hacer todo el trabajo desde un inicio, vamos, que no se te ocurrió generar el string y posteriormente verificar si existe, si no existe lo ingresas y si existe vuelves a llamar a la función hasta que te entregue un string libre?, vamos, dependiendo del numero de caracteres es la posibilidad de que se repitan, si generas un string de 5 caracteres y cada carácter puede tener 36 posibilidades saca la cuenta, te la ahorro, son mas de 60 millones a 1 a que se repita, a menos que manejes millones de registros es muy dificil que se repitan, ahora, si vas a tener millones de registros genera un string mas grande.... 10/15/20 caracteres?

Ahora, quieres ahorrarte todo esto, genera una ID auto incrementable y única
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #7 (permalink)  
Antiguo 13/07/2011, 23:18
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Generar ID alfanumérico

bueno nemutagk.. por algo dije que no queria recortar el string... me parecia poco seguro.. y me parece poco eficaz andar chequeando si existe ya...

es muy facil esa solucion.. es la primera que se me ocurrió.. y justamente por eso abri este tema, para ver si a alguien se le ocurria algo mejor...

y .. te hago una pregunta.. con el tema de los 5 caracteres... el script genera 15000 veces ... y todos estan ocupados.. hasta que encuentra uno aleatoriamente que sea libre??

mmm no me parece correcto eso :S
  #8 (permalink)  
Antiguo 13/07/2011, 23:23
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Generar ID alfanumérico

Cuando generas tu un ID/string/etc "aleatoriamente" SIEMPRE vas a tener una probabilidad X de que se repita, ya que no tienes control sobre esta y esta probabilidad aumentará cada vez que hagas un nuevo registro, por algo se le llama aleatorio, no quieres tener problemas con IDs repetidos usa el sistema que se creo para eso, un ID autoincrementable y único

Por cierto, como dato "cultural" >.<, en la informática no existe como tal lo aleatorio, las funciones que generan algún numero/string siempre utilizarán funciones como time(), microtime() etc (al menos en php), por lo tanto no tendrás nunca un string realmente generado al azar
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #9 (permalink)  
Antiguo 13/07/2011, 23:25
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Generar ID alfanumérico

la idea es generar id alfanumericos.. que se basen en los ID autoincrementables generados...

por eso la primer idea que surge es

substr(md5($id),0,8)

Estoy buscnado alternativas a eso nemutagk...
  #10 (permalink)  
Antiguo 13/07/2011, 23:34
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: Generar ID alfanumérico

Bueno, hay cambia la cosa, en ningún momento hablaste de generar un ID alfanumerico con una SEMILLA, para eso existe srand() o mt_srand(), aunque el problema de generar ID repetidos puede aun presentarse aunque sea en una probabilidad mas baja, ahora, en la página tienes un ejemplo generando una semilla con microtime, si generas una semilla con el hash (md5) de tu ID autoincrementable podrías bajar aun mas la probabilidad, pero nunca llegaras a 0, si vas a tener muchos registros (miles o millones) lo mas aconsejable es que verifiques si ya existe o no dicho ID
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #11 (permalink)  
Antiguo 14/07/2011, 03:00
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Generar ID alfanumérico

No entiendo el problema....

Por ejemplo, si quieres un alfanumerico de ... 5 caracteres, iria desde
00000

hasta
ZZZZZ

no?

En el caso (casi seguro) que lo vayas a ir guardando en una tabla, deberías hacer lo siguiente:

bloquear tabla
leer ultimo id alfanumerico
incrementarlo en 1
guardar el registro
desbloquear tabla.

Con eso tendrias un id autoincremental alfanumerico de 5 caracteres. ¿Cual es el problema? :)
  #12 (permalink)  
Antiguo 14/07/2011, 05:15
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Generar ID alfanumérico

Exacto, lo único que tienes que hacer es crear un alfabeto de 34 caracteres, de 0 a 9 y de A a Z y crearte la operación que sume uno, de forma que: 0+1=1, 9+1=A, Z+1=10... Es el mismo concepto que la aritmética hexadecimal, solo que sería 34-decimal y, además, tienes la facilidad de que no tienes que implementar toda la aritmética, sólo el sumar 1.

Un saludo.
  #13 (permalink)  
Antiguo 14/07/2011, 05:26
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 13 años, 8 meses
Puntos: 202
Respuesta: Generar ID alfanumérico

¿Y porque hallas el número de filas (+1) que tiene la tabla y ese número lo conviertes en alfanumérico con md5 y ya? Así serían únicos y tiene tanto letras como números jejeje. Es la solución más simple.
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(
  #14 (permalink)  
Antiguo 14/07/2011, 08:02
(Desactivado)
 
Fecha de Ingreso: julio-2009
Mensajes: 174
Antigüedad: 14 años, 9 meses
Puntos: 3
Respuesta: Generar ID alfanumérico

te cuento como lo haria yo:

En la base de datos generaria el id numerico
despues cuando necesito las letras haria una funcion para codificar y otra para decodificar el id en letras

por ejemplo:
en ascii las letras son 25 del 97 al 122

osea que a tu numero habria que pasarlo de decimal a un sistema de base 25, para esto se divide el numero por 25 y con los restos al reves se forma el numero. estos restos son de 0 a 25 por lo que hay que sumarle 97 (para que cero sea igual a 97 y 25=122)



la funcion de decodificar tendira que agarrar cada caracter, pasarlo con ord() a su correspondiente ascii, restarle 97, y acumularlo en un array al revez, osea que la unidad sea el array[0], la decena el array[1]..., despues con un foreach(array as variable) sumar todas las variables*10^posicion en el array


si te parece hacerlo asi te ayudo en el codigo, avisame

Última edición por dscafati; 14/07/2011 a las 08:08
  #15 (permalink)  
Antiguo 14/07/2011, 08:18
marcofbb
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Generar ID alfanumérico

podes hacer

$id = md5($id.$time.$usuario);
substr(md5($id),0,8);

Ya seria casi imposible que se repita,
  #16 (permalink)  
Antiguo 14/07/2011, 11:43
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Generar ID alfanumérico

Hola, muchas gracias a todos por las respuestas :)

veo muchas soluciones interesantes.. y que no se me habían ocurrido.. las vo ya tener muy en cuenta..

la que entendí en teoría, pero no como llevarla a la práctica es la tuya dscafati, como se realiza ese pasaje con base 25??

Saludos! :)
  #17 (permalink)  
Antiguo 14/07/2011, 14:56
marcofbb
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Generar ID alfanumérico

Cita:
Iniciado por nicolaslt Ver Mensaje
Hola, muchas gracias a todos por las respuestas :)

veo muchas soluciones interesantes.. y que no se me habían ocurrido.. las vo ya tener muy en cuenta..

la que entendí en teoría, pero no como llevarla a la práctica es la tuya dscafati, como se realiza ese pasaje con base 25??

Saludos! :)
Cada letra en ASCII tiene un numero, entonses a ese numero le sumas X cantidad y te da otra letra, pero no se recomienda ya que aveces te va a repetir.


Ejemplo: el numero clave es 4

A R R O Z
65 82 82 79 90 (valor ascii de cada letra)
4 4 4 4 4 (mas numero clave)
E V V S D

Ahi esta :)
  #18 (permalink)  
Antiguo 14/07/2011, 15:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Generar ID alfanumérico

Yo uso algo así:
Código PHP:
define('SHORTER_CHARSET''F5SGQPqprZmD0nlu4L8BfAKHCbgVNM2chkJeRix7vW6oY9yX1aE3twOdjUzTsI');
define('SHORTER_FIXNUM'1663200);

function 
do_hash($id)
{
  
$codeset SHORTER_CHARSET;
  
$base strlen($codeset);
  
$out '';
  
  
$id += SHORTER_FIXNUM;
  
  while (
$id 0)
  {
    
$out substr($codeset, ($id $base), 1) . $out;
    
$id floor($id $base);
  }
  return 
$out;
}

function 
do_id($hash)
{
  
$codeset SHORTER_CHARSET;
  
$base strlen($codeset);
  
$out 0;
 
  for (
$i strlen($hash); $i 0; --$i)
  {
    
$out += strpos($codesetsubstr($hash, (-* ( $i strlen($hash) )),1)) * pow($base$i -1);
  }
  
  
$out -= SHORTER_FIXNUM;
  
  return 
$out;

SHORTER_CHARSET es el conjunto de caracteres a emplear por la función, yo utilizo el abecedario completo y números.

Dicho conjunto de caracteres lo obtengo así:
Código PHP:
$str 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$str str_shuffle($str);
echo 
$str
La idea es que mientras mas desordenada sea la secuencia mas difícil es adivinar el siguiente ID generado, pues sería sencillo deducir que después de la A sigue la B.

SHORTER_FIXNUM se utiliza igualmente para "deformar" la percepción del usuario con respecto del ID actual, pues el primer ID sería tan solo un carácter, y eso no lo personal no me agrada.

El valor mínimo de dicha constante es relativo, pueden aumentarlo tanto como deseen.

Dicho valor no afecta en lo absoluto la conversión del ID numérico original.

NOTA: una ves implementado el script no conviene cambiar ninguna de estas configuraciones, ustedes entenderán.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #19 (permalink)  
Antiguo 14/07/2011, 18:41
Avatar de nicolaslt  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 119
Antigüedad: 15 años
Puntos: 5
Respuesta: Generar ID alfanumérico

Buenas..

Bueno, les aviso que ya dí solucion al problema.

Me decidí por la solución que me propusieron vgonga1986 y eleazan en un principio...

Y encontré un link muy interesnte en la pagina w3support.net

http://es.w3support.net/index.php?db=so&id=959957

Esta función es la encargada de codificar y decodificar los números en el código.

Código PHP:
Ver original
  1. class BaseIntEncoder {
  2.     //const $codeset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  3.     //readable character set excluded (0,O,1,l)
  4.     const codeset = "0123456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ-_";
  5.     static function encode($n){
  6.         $base = strlen(self::codeset);
  7.         $converted = '';
  8.         while ($n > 0) {
  9.             $converted = substr(self::codeset, bcmod($n,$base), 1) . $converted;
  10.             $n = self::bcFloor(bcdiv($n, $base));
  11.         }
  12.         return $converted ;
  13.     }
  14.     static function decode($code){
  15.         $base = strlen(self::codeset);
  16.         $c = '0';
  17.         for ($i = strlen($code); $i; $i--) {
  18.             $c = bcadd($c,bcmul(strpos(self::codeset, substr($code, (-1 * ( $i - strlen($code) )),1))
  19.                     ,bcpow($base,$i-1)));
  20.         }
  21.         return bcmul($c, 1, 0);
  22.     }
  23.     static private function bcFloor($x)
  24.     {
  25.         return bcmul($x, '1', 0);
  26.     }
  27.     static private function bcCeil($x)
  28.     {
  29.         $floor = bcFloor($x);
  30.         return bcadd($floor, ceil(bcsub($x, $floor)));
  31.     }
  32.     static private function bcRound($x)
  33.     {
  34.         $floor = bcFloor($x);
  35.         return bcadd($floor, round(bcsub($x, $floor)));
  36.     }
  37. }

Saludos y gracias a todos los que respondieron ;)
  #20 (permalink)  
Antiguo 15/07/2011, 02:26
Avatar de vgonga1986  
Fecha de Ingreso: marzo-2008
Ubicación: País de Pandereta
Mensajes: 1.021
Antigüedad: 16 años, 1 mes
Puntos: 253
Respuesta: Generar ID alfanumérico

La verdad que ha sido un tema muy interesante y ha habido un montón de respuestas diferentes que ni se me habrían ocurrido. Esta es la magia de la programación, que cada cabeza pensante llegará a una solución diferente.

Un saludo y suerte.

PD: una pena lo de River, a ver si volvéis el año que viena a primera.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 17:12.