Generador de ID continuas al estilo URL corta
Bueno…. si… es bueno para matar al Alzheimer
Bajo la duda de un amigo acerca de como generar numeros de ID cortos para utilizar en un servicio acortador de url’s se me ocurrio utilizar letras mayusculas y minusculas para aumentar la cantidad de posibles valores en una posicion de la cadena, ya que los numeros solo permitian 10 posibilidades (0-9) y la cadena se alargaria rapidamente.
De esta manera puedo generar cadenas al estilo “a1D2″, y producir su valor consecutivo, que quedaria asi “a1D3″, asi hasta llegar al “a1D9″ y luego comenzar con “a1DA”, asi hasta terminar las mayusculas, y minusculas. Una vez sucedido esto, el movimiento es similar al de un cuenta kilometros. y el valor quedaria asi “a1F0″ y podriamos seguir!..
Ahora bien, la funcion puede generar el siguiente id, partiendo desde cualquier anterior!..
Por ejemplo, si le ingresaramos el ID “0″ nos devolveria 1 y si ingresaramos el id “0000″ nos devolveria 0001, tambien si pusieramos “ABCD” nos devolveria “ABCE”.
La declaración de la funcion es la siguiente.
/** * Genera la cadena siguiente a una cadena de caracteres alphanumericos no simbolicos ingresada * * @author Cristián Pérez * @param string $current * @return string * */ function getNextKey($current) { $chars = array(); for($i = 0; $i < strlen($current); $i++) { $chars[$i] = ord(substr($current, $i, 1)); } $ci = count($chars) - 1; for($i = $ci;;$i--) { if(($chars[$i] >= 48 && $chars[$i] < 57) || (($chars[$i] >= 65 && $chars[$i] < 90) xor ($chars[$i] >= 97 && $chars[$i] < 122))) { ++$chars[$i]; break; } if($chars[$i] == 57) { $chars[$i] = 65; break; } elseif($chars[$i] == 90) { $chars[$i] = 97; break; } if($i == 0) { if($chars[$i] == 122) { foreach($chars as &$char) { $char = 48; } $chars[count($chars)] = 48; } break; } else { $chars[$i] = 48; } } foreach($chars as &$char) { $char = chr($char); } return implode('', $chars); }
Un ejemplo practico para que entiendan como funciona es el siguiente, el cual pueden copiar y pegar en un archivo nuevo para que lo prueben.
$form = '<form action="" method="post">'; $form .= '<input type="text" name="currentID" value="%s" />'; $form .= '<input type="submit" value="Siguiente ID" />'; $form .= '</form>'; if ($_POST) { printf($form, getNextKey($_POST['currentID'])); } else { printf($form, '0'); }
Bugs, preguntas, sugerencias, lo que sea es aceptado!.
Espero que les sirva!
Saludos!!
HOla gracias por el aporte me sirvio mucho … Saludos…::