Recientemente necesitaba generar identificadores únicos, breves, que no fueran dependientes del contenido, y no aleatorios… si bien podrían haber sido simplemente números enteros, además quería que no fueran explícitamente secuenciales.
Finalmente me decidí por utilizar números en base 36, una técnica bastante utilizada por servicios para acortar URLs, como TinyURL y otros. La gracia de este sistema es que puede representar números grandes en una secuencia de letras y números; y se puede lograr tanto en PHP como en Javascript (además de un montón de otros lenguajes).
Con PHP, podemos utilizar la función base_convert():
$id_numerico = '175598584'; /** * La función toma como argumentos: * @param string El número que se va a convertir, como string * @param int La base del número original, en este caso 10 porque es decimal * @param int La base a la que se desea convertir; en este caso 36 */ $en_base_36 = base_convert( $id_numerico, 10, 36 ); // obtenemos '2wjoqg' // ... y en caso que necesitemos obtener nuevamente el número original $numero_original = base_convert( $en_base_36, 36, 10 );
Valga la advertencia, que en en PHP se puede producir una pérdida de precisión con números grandes (muuuy grandes).
En Javascript, podemos utilizar:
var id_numerico = 175598584; // el parámetro que se pasa a .toString() es la base var base_36 = id_numerico.toString( 36 ); // obtenemos '2wjoqg' // ... y convertir nuevamente a numerico var numero_original = parseInt( base_36, 36 );