Aujourd'hui je vais aborder la création d'identifiants non numérique en php, la classe suivante est basée sur le code de la fonction dec2any de ce commentaire.
Pourquoi utiliser des identifiants non numériques ?
Les raisons qui poussent les développeurs php à utiliser des identifiants non numériques sont multiples je vais vous en énoncer quelques unes :
- Raccourcir les urls : la version non numérique des identifiants est d'autant plus courte que la base choisies est grande.
- Empêcher de se faire voler du contenu : En utilisant une base personnalisée pour ses identifiants la tache d'aspiration de contenu est complexifiées.
- Se la raconter : Ben ouai c'est toujours bon de se la péter un peu :D.
Classe de génération d'identifiants alphanumériques
Voici le code de la classe que j'utilise pour générer des identifiants comme youtube, mais ce code peu tout à fait être utiliser pour un service d'url shortener (comme tinyurl et autres ...). Couplé à un identifiant en autoincrément l'utilisation de cette classe permet de minimiser les risques de collision des méthodes aléatoires.
A noter qu'il est possible de personnaliser la base en modifiant l'ordre des caractères ou en ajoutant des caractères non alphanumérique comme "-" et "_".
<?php
/**
* Classe de gestion d'identifiants alphanumériques
* @author Patrick Poulain
* @since 2009-08-04
* @see http://petitchevalroux.net
*
* Exemple d'utilisation :
* $num = 1076143261;
* var_dump(AlphaId::getAlpha($num));
* => string '1aPo1n'
* var_dump(AlphaId::getNum(AlphaId::getAlpha($num)));
* => int 1076143261
*
*/
class AlphaId
{
/**
* Base pour la création des identifiants alphanumériques
*
* @var String
*/
private static $base = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
/**
* Cardinalité de la base utilisée
*
* @var int
*/
private static $baseLength = false;
/**
* Retourne un identifiant alphanumérique à partir d'un nombre
*
* @param float $numId
* @return string
*/
public static function getAlpha($numId)
{
if(self::$baseLength === false)
{
self::$baseLength = strlen(self::$base);
}
$alphaId = '';
for ($t = floor(log10($numId)/log10(self::$baseLength));$t >= 0;$t--)
{
$a = floor($numId/pow(self::$baseLength,$t));
$alphaId .= self::$base[$a];
$numId = $numId - ( $a * pow(self::$baseLength,$t));
}
return $alphaId;
}
/**
* Retourne un identifiant numérique à partir d'un identifiant non numérique
*
* @param string $numId
* @return float
*/
public static function getNum($alphaId)
{
if(self::$baseLength === false)
{
self::$baseLength = strlen(self::$base);
}
$numId = 0;
$length = strlen($alphaId) - 1;
for ($t = 0;$t <= $length; $t++ )
{
$numId = $numId + strpos(self::$base, substr($alphaId, $t, 1 ) ) * pow(self::$baseLength, $length - $t );
}
return $numId;
}
}
?>
Image : Mykl Roventine