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($codeset, substr($hash, (-1 * ( $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.