Facebook LinkedIn SourceForge Twitter RSS LastFM
logologo

Convertir des nombres en base 62 avec PHP

Geoffray Warnants|09/02/2011|77 commentaires

Dans la continuit du billet trs intressant de Vincent Battaglia consacr l'utilit du systme de numration hexatridcimal (soit en base 36) dans l'algorithme d'un raccourcisseur d'URL, j'ai voulu savoir si utiliser d'autres systmes de numration encore plus vastes, comme le base 62 voqu la fin de son article, pouvait se faire avec autant de facilit, ce qui permettrait de gnrer des URL encore plus courtes moindre effort.

Comme il l'a dj bien expliqu, le principal critre qui influencera le choix entre l'une de ces deux bases est certainement le souci de la sensibilit la casse. En effet, la base 36 se concentre sur le systme alphanumrique minuscule tandis que la base 62 inclut aussi les caractres majuscules.

D'autre part, il va videmment de soi qu'au plus la base est leve (autrement dit au plus l'ventail de symboles possibles est vaste), au plus un nombre peut-tre reprsent de manire concise. Dans le cadre des raccourcisseurs d'URL, c'est donc aussi un critre primordial. Non seulement pour l'conomie de caractres que cela implique, mais aussi pour le nombre d'identifiants que le service pourra grer, et donc le nombre d'URL qu'il pourra prtendre offrir. Bien que la plupart des services actuels comme TinyURL, bit.ly ou goo.gl semblent s'tre limits une base 62, d'autres sont plus aventureux, comme par exemple le service (belge, disons-le !) http://ui.tl qui affirme tre le plus concis du march par l'utilisation d'une base 163, prenant ainsi le risque d'inclure des caractres accentus dans ses rsultats.

Lors de la mise en pratique, je fus tout d'abord surpris de dcouvrir que la fonction base_convert de PHP ne supporte pas la conversion d'un nombre en base 62. L'occasion tant trop tentante, j'en ai profit pour rcrire une fonction sensiblement identique permettant cette fois de jongler entre diffrentes bases arbitraires avec une totale libert.
Par la mme occasion, j'y ai ajout au travers d'un dernier paramtre optionnel la possibilit de spcifier le jeu de caractres prendre en compte lors de la conversion. J'y vois plusieurs cas d'utilisation concrets, comme par exemple :

  • Pouvoir djouer le caractre prdictif inhrent ce genre de conversion, en spcifiant un alphabet dont l'ordre aura t pralablement altr.
  • Pouvoir gnrer des valeurs "user-friendly", en omettant par exemple les caractres susceptibles de prter confusion lors de la lecture, tels o,O,0,1,l, etc...
  • Pouvoir dfinir son propre jeu de caractres, qui pourrait par exemple inclure des caractres spciaux.
/**
 * Convertit un nombre entre diffrentes bases.
 *
 * @param   string      $number     Le nombre  convertir
 * @param   int         $frombase   La base du nombre
 * @param   int         $tobase     La base dans laquelle on doit le convertir
 * @param   string      $map        Eventuellement, l'alphabet  utiliser
 * @return  string|false            Le nombre converti ou FALSE en cas d'erreur
 * @author  Geoffray Warnants
 */
function base_to($number, $frombase, $tobase, $map=false)
{
    if ($frombase<2 || ($tobase==0 && ($tobase=strlen($map))<2) || $tobase<2) {
        return false;
    }

    if (!$map) {
        $map = implode('',array_merge(range(0,9),range('a','z'),range('A','Z')));
    }

    // conversion en base 10 si ncessaire
    if ($frombase != 10) {
        $number = ($frombase <= 16) ? strtolower($number) : (string)$number;
        $map_base = substr($map,0,$frombase);
        $decimal = 0;
        for ($i=0, $n=strlen($number); $i<$n; $i++) {
            $decimal += strpos($map_base,$number[$i]) * pow($frombase,($n-$i-1));
        }
    } else {
        $decimal = $number;
    }

    // conversion en $tobase si ncessaire
    if ($tobase != 10) {
        $map_base = substr($map,0,$tobase);
        $tobase = strlen($map_base);
        $result = '';
        while ($decimal >= $tobase) {
            $result = $map_base[$decimal%$tobase].$result;
            $decimal /= $tobase;
        }
        return $map_base[$decimal].$result;
    }
    return $decimal;
}

Pour se faire une ide de l'allure que peuvent avoir les valeurs retournes par cette fonction, voici titre indicatif les rsultats d'une srie de conversions entre diffrentes bases. En ce qui concerne la base 163, j'ai considr le jeu de caractres revendiqu par le service http://ui.tl.

base 10 base 16 base 36 base 62 base 163
100 64 2s 1C Æ
1000 3e8 rs g8
10000 2710 7ps 2Bi e%
100000 186a0 255s q0U %}I
1000000 f4240 lfls 4c92 OIÌ
10000000 989680 5yc1s FXsk $6Ô@
100000000 5f5e100 1njchs 6LAze @gÉ1
1000000000 3b9aca00 gjdgxs 15FTGg #5Û#.
10000000000 2540be400 4ldqpdk aUKYOs 6^/5Ç

<<< Retour

Vos commentaires

48 commentaires posts

Melinda Gregorie
03/12/2020 02:59Post par Melinda Gregorie
En regardant tout simplement votre langage, j?ai déjà eu quelque mot de tête. J?avoue que vous êtes des génies pour arriver à effectuer ce genre de truc. De toute façon, ceci est destiné seulement pour les mathématiciens.
Maëlys De Luca
04/08/2020 14:48Post par Maëlys De Luca
Je suis tombé par hasard sur votre site et je trouve que votre langage de programmation va résoudre mon problème. En fait, j?ai une amie qui m?a conseillé d?apprendre ce langage pour piloter mon ordinateur. Merci beaucoup?!
Ambre Dumas
02/08/2020 04:40Post par Ambre Dumas
Mon frère est un informaticien et il connaît parfaitement le langage de programmation. Parfois, il m?apprend quelque base, mais j?avoue qu?il est assez difficile de devenir un programmeur si on n?a pas de bases solides en Mathématique.
Iris Morgane
31/07/2020 21:06Post par Iris Morgane
Actuellement, on peut trouver n?importe quelle réponse sur internet lorsqu?on veut apprendre quelque chose. Je ne connais rien à ce langage, mais j?aimerais apprendre son utilité. Donc, je pense que votre article pourrait m?aider. Merci beaucoup?!
Léonie Garcia
31/07/2020 10:11Post par Léonie Garcia
Malgré le fait que votre publication soit un peu vieille, on peut quand même trouver des bonnes choses. Et je sais que votre langage de programmation va aider un bon nombre de personnes pour résoudre leurs problèmes. Merci beaucoup pour votre tuyau.
Marina Claire
30/07/2020 10:05Post par Marina Claire
Pour ma part, le langage de programmation est destiné seulement pour les informaticiens et les mathématiciens. En fait, les signes et les codes utilisés pour formuler les instructions avec un ordinateur sont vraiment très compliqués.
Sofia Lechat
28/07/2020 21:04Post par Sofia Lechat
J?ai une amie qui apprend le langage de programmation. Elle me rend visite tous les week-ends et j?arrive un peu à connaître les bases de ce dernier. Mais j?avoue que le travail d?un programmeur n?est pas facile.
Adèle Martin
28/07/2020 19:09Post par Adèle Martin
Actuellement, les utilisations du langage de programmation sont très nombreuses. Personnellement, j?avoue que devenir un programmeur n?est pas facile. J?ai déjà essayé une fois, mais avant toute chose, il faut avoir une solide base en mathématiques.
Sarah Thomas
25/07/2020 05:18Post par Sarah Thomas
Pour moi, votre idée est tout simplement une sorte de publicité pour attirer les clients. En fait, j?ai déjà visité des sites comme celui-ci et j?avoue que vous êtes tous pareils. Je me demande si vous n?avez pas honte de vous.
Lou Robert
23/07/2020 09:01Post par Lou Robert
À mon avis, je pense que votre langage de programmation va aider un bon nombre de personnes. Mais j?ai une question, est-ce qu?il existe des bases strictement requises pour devenir un programmeur?? Merci beaucoup?!
Mila Girard
22/07/2020 15:29Post par Mila Girard
Je trouve que le langage de programmation est parmi les outils de base pour la technologie. Alors, je pense que tout le monde doit être au courant de son fonctionnement. Merci beaucoup pour votre partage.
Léna Dumont
19/07/2020 21:03Post par Léna Dumont
Merci beaucoup pour votre partage. J?ai travaillé sur le langage de programmation quand j?étais encore une stagiaire, élaborer un programme n?est pas une mince affaire. Mais heureusement qu?il y avait Mr Simon, mon encadreur, pour me guider.
Jade Denis
17/07/2020 10:02Post par Jade Denis
En termes de langage de programmation, je suis parmi les meilleurs. Ce que les gens ne savent pas dans la transcription d?un programme, c?est qu?il faut consacrer au moins quatre heures pour le faire.
Margot Faure
17/07/2020 08:23Post par Margot Faure
Sur tous les sites que j?ai visités, je constate qu?il y a toujours de nombreuses critiques sur les zones de commentaires. Il y a des gens qui ne sont pas fiers du succès des autres. C?est vraiment triste.
Zoé David
16/07/2020 09:57Post par Zoé David
Malgré le fait que votre article soit un peu vieux. Je pense que votre langage est important pour la plupart des internautes. Plus précisément, pour les vraies internautes, mais non pas pour les gens qui critiquent tout le temps.
Mia Simon
11/07/2020 06:03Post par Mia Simon
J?ai une amie qui connait parfaitement le langage de programmation. Alors, je peux tester ce genre de chose avec elle. Mais j?ai une question, cette publication est un peu vieille, est-ce qu?on peut encore essayer votre Langage??
Camille Moreau
11/07/2020 05:00Post par Camille Moreau
Comme toute chose si tu veux apprendre, il faut que tu cherches des moyens pour y arriver. Personnellement, tout le monde peut devenir un bon programmeur, il faut seulement qu?il apprenne la base.
Louna Camara
10/07/2020 19:08Post par Louna Camara
Depuis longtemps, j?ai toujours rêvé d?apprendre le langage de programmation. Mais j?avoue que tout le monde ne peut pas être un programmeur. Toutefois, je reste convaincu que chaque personne a son talent et sa capacité.
Manon Fournier
09/07/2020 16:24Post par Manon Fournier
Moi aussi, je ne connais rien en langage de programmation. Mes amies parlent souvent de ce genre de chose. Toutefois, je pense que je peux apprendre ce langage et j?ai une idée sure où je peux commencer.
Céleste Aubrey
06/07/2020 14:31Post par Céleste Aubrey
Je reste persuadé que ce langage est déjà obsolète de nos jours. Même un expert en termes de propagation a une difficulté avec cela. En tout cas, c?est ce que je crois, d?après ce que j?ai vu.
Brunelle Bouvier
06/07/2020 10:02Post par Brunelle Bouvier
En ce qui me concerne, je ne comprends rien de rien à ce que vous dites là. C?est très loin des langages que j?ai appris lors de mes études supérieures. Toutefois, j?aimerais en apprendre davantage.
Gabrielle Durand
30/06/2020 13:50Post par Gabrielle Durand
Je ne connais rien en termes de langage de programmation. Mais en regardant votre site, j?ai envie de le tester. Est-ce que quelqu?un peut m?aider pour apprendre les bases de ce truc?? Merci d?avance pour votre collaboration.
Carine Gaston
30/06/2020 09:45Post par Carine Gaston
Les internautes cherchent des nouvelles choses intéressantes chaque jour. Et je pense que votre langage va aider pas mal de personnes avec ce genre de problèmes. Mais en ce qui me concerne, je ne trouve pas d?intérêt à cela.
Patricia Bernard
29/06/2020 07:11Post par Patricia Bernard
Je trouve qu?il existe des personnes qui attendent trop les autres pour résoudre tous ses problèmes. Même si on leur donne de nombreuses solutions, ils cherchent toujours des problèmes à la solution qu?on lui propose.
Sabrina Georges
28/06/2020 20:43Post par Sabrina Georges
Bien sûr, les internautes peuvent chercher toutes les choses qui leurs intéressent. Mais quand quelqu?un donne des solutions pour résoudre ton problème, il faut le remercier sans faire de la discussion, même si cela ne te va pas.
Diana Jerry
24/06/2020 22:08Post par Diana Jerry
Ne vous souciez pas du fait qu?elles exagèrent, mais compatissez et donnez des solutions si vous en avez. Votre remarque a tendance à juger les gens, pourtant, on n?est pas là pour cela, je crois.
Déborah Stéphane
24/06/2020 15:53Post par Déborah Stéphane
Je dirais plutôt qu?il ne faut pas exagérer dans tout ce qu?on raconte. Certaines personnes en rajoutent toujours un peu trop. Je ne sais pas vraiment dans quel but elles font cela, mais c?est ridicule.
Lisa Anne
22/06/2020 22:41Post par Lisa Anne
Si tu as des solutions pour résoudre les problèmes d?autrui, il faut les lui donner. N?attends pas qu?il te supplie. Dans la vie, personne n?est parfait et on a toujours besoin des autres. Le fait est qu?on ne sait pas ce que demain nous réserve.
Nina Thomas
22/06/2020 21:06Post par Nina Thomas
Je trouve que presque tous les internautes cherchent à résoudre leurs problèmes personnels sur des sites. Il n?y a pas de mal à tout ça, je crois. Mais, il ne faut pas abuser quand même dans ce qu?on partage.
Larissa Dubois
17/06/2020 06:25Post par Larissa Dubois
Merci beaucoup pour le tuyau. En fait, lorsqu?on rencontre des problèmes, il faut revoir les bonnes vieilles méthodes. Je ne maîtrise pas encore très bien ce langage, mais votre article m?a quand même bien aidé.
Emma Durand
15/06/2020 18:15Post par Emma Durand
Je vois que de nombreuses personnes ont trouvé une solution à leur problème sur ce site. Mais à ce que je vois, il n?y a plus aucune réaction. C?est tellement dommage, je trouve. En tout cas, merci beaucoup.
Stéphanie Dupond
12/06/2020 07:14Post par Stéphanie Dupond
Je ne crois pas que c?est de la male chance. D?ailleurs cela ne suffit pas pour vous qualifier comme étant une personne qui n?a pas de chance. Vous trouverez certainement une solution à votre problème ailleurs.
Anna Richard
10/06/2020 21:06Post par Anna Richard
Personnellement, je compte parmi ceux qui ont trouvé une solution sur ce site. Je trouve dommage qu?ils aient arrêté les activités en fait. J?ai encore certaines questions en suspens. Mais, je ne sais pas à qui m?adresser.
Rose Mallard
08/06/2020 22:23Post par Rose Mallard
En effet, je crois que vous avez raison. Le fait est que moi-même j?ai trouvé pas mal de trucs intéressants et qui m?ont beaucoup aidé sur ce site. Seulement, je trouve dommage qu?il ne réagisse plus actuellement.
Rachelle Gaston
08/06/2020 21:21Post par Rachelle Gaston
Malgré le fait que ce site est un peu ancien. On peut trouver des trucs intéressants et de découvrir d?autre chose qu?on peut essayer. Merci beaucoup pour le partage de votre travail en tant que professionnel.
generic ventolin albuterol inhalers
08/06/2020 06:55Post par generic ventolin albuterol inhalers
generic ventolin albuterol inhalers
where can i buy cialis without a prescription
20/05/2020 18:47Post par where can i buy cialis without a prescription
I'm not certain where you are acquiring your info, only swell
subject. I of necessity to expend some metre encyclopaedism a lot more than or understanding more than.
Thanks for excellent information I was looking for this data for
my deputation.
Amandine
20/03/2020 08:48Post par Amandine
Bonjour,
Merci pour le partage, mais c?est vraiment utile pour moi.
Harlie
19/03/2020 08:58Post par Harlie
Bonjour,
Merci pour cet article, c?est vraiment utile.
Rio
19/03/2020 08:57Post par Rio
Bonjour,
Merci pour cet article, c?est vraiment utile.
Maxime
23/02/2020 01:14Post par Maxime
Du moment que ces petites astuces donnent un résultat positif, je suis preneur. Un grand merci pour cet article.
Rossignol
30/09/2019 19:10Post par Rossignol
Jusqu'à présent je n'ai pas eu à utiliser le base 62. Mais l'info est à mettre dans un coin de la tête.
Spectacleinthefarm
12/02/2019 09:53Post par Spectacleinthefarm
Dommage que le blog n'est plus mis à jour.
Rachel
19/09/2017 12:57Post par Rachel
Bonjour,j'aime le style de votre blog, beaucoup de articles sont utiles à lire!!!
Pierre
09/08/2017 10:56Post par Pierre
Merci beaucoup pour ce petit code PHP que je recherchais.
nicod
15/10/2013 16:50Post par nicod
Super!!!

j'ai juste une question, pourquoi lorsque que je fais un base_to de quelque chose en faisant l'inverse ça redonne pas pareil?
exemple:

echo base_to('musique', 32, 62); // qUOmj
echo base_to('qUOmj', 62, 32); // br9j0f
sacha
23/04/2013 14:35Post par sacha
Merci pour cet article et ce code. Je vais voir pour l'intégrer sur mon site !
syndrael
09/02/2011 08:38Post par syndrael
Même si la base 36 est utile, je trouve que jouer sur le case-sensitive dans l'URL n'est pas approprié, mais ce n'est que mon avis..
En effet, les noms de domaines sont case-insensitive, ou si je me trompe, ont toujours été définis en minuscule. Donc une partie case-insensitive suivie d'une autre case-sensitive, je trouve ça 'illogique'
S.

Ragir cet article

*


(Ne sera pas publie, servira uniquement afficher votre gravatar)


(Lien en dur et dofollow)

zend framework