Savez-vous compter en hexatridécimal ?

Le système hexatridécimal est un système de numération positionnel en base 36. Il utilise 36 symboles, généralement les chiffres arabes + les 26 lettres de l’alphabet. Dans le même ordre d’idées, les informaticiens du monde entier connaissent depuis leur plus jeune âge le système binaire (base 2 avec uniquement 0 et 1 comme symboles) ainsi que le système hexadécimal (base 16, utilisé notamment pour exprimer les codes de couleurs). Le système le plus courant (et le plus naturel pour le commun des mortels) est bien entendu le système décimal (en base 10).

Le système hexatridécimal (parfois également nommé alphadécimal, hexatrigésimal ou encore sexatrigésimal) est moins connu et moins répandu. Pourtant, il a trouvé récemment une utilisation tout à fait pratique depuis l’apparition des raccourcisseurs d’URL (URL shorteners) qu’on trouve partout sur le Web aujourd’hui, grâce notamment à l’explosion de Twitter (qui a d’ailleurs son propre raccourcisseur d’URL).

36

En 2009, nous avions lancé un raccourcisseur d’URL pour smart, la célèbre marque de voitures compactes. Vous pouvez encore le trouver sur oym.be. Pour créer une URL courte, une chaîne de caractère de 6 caractères (qu’on appelle hash et qui est composé de chiffres et de lettres) était générée et ensuite concaténée au domaine pour obtenir une URL finale de ce genre oym.be/7zrgiq (20 caractères au total en comptant « http:// »). Le fait d’utiliser 6 caractères permettait de générer plus de deux milliards d’URL (36^6). Néanmoins, s’il fallait le refaire, il serait sans doute plus pertinent d’utiliser un système d’URL basé sur les nombres exprimés en base 36.

En effet, en générant nos hashes dans l’ordre en base 36, nos premières URL générées seront très courtes et se rallongeront au fur et à mesure.

En considérant que le nom de domaine de notre raccourcisseur d’URL est sho.rt, nous pourrons constater les cas de figure suivants :

On remarque que le nombre de caractères du hash reste assez bas (à peine trois caractères après une dizaine de milliers d’URL), malgré le nombre relativement élevé d’URL déjà générées. Peu de raccourcisseurs d’URL pourront prétendre atteindre une taille de hash plus élevée que 5, ce qui correspondrait à un nombre total de plus de soixante millions d’URL générées ! Il y a donc énormément de chances que nos URL soient toujours plus courtes que celles générées de façon aléatoire sur oym.be !

Comment mettre tout ça en pratique ?

PHP nous fournit la fonction base_convert() qui est fort pratique car elle permet de convertir un nombre d’une base à une autre. Par exemple, base_convert('10', 36, 10) donne 36 comme résultat (1*36^1 + 0*36^0). Le premier paramètre est le nombre à convertir, le second est la base du nombre à convertir et le troisième est la base dans laquelle le convertir.

Du côté de la DB, il vous suffit de créer une table avec les champs (minimum) suivants :

  • id (entier non signé, auto increment, clé primaire)
  • long_url (chaîne de caractère)

Pour générer le hash d’une URL courte, il vous suffit de faire un INSERT de l’URL longue dans la table, de récupérer l’id venant d’être générée (via la fonction mysql_insert_id() par exemple) et de le transformer en base 36 via la fonction base_convert().

Pour récupérer l’URL longue correspondant à votre hash, vous devrez convertir celui-ci en base 10, effectuer un SELECT dans votre table sur cet identifiant, récupérer l’URL longue et finalement faire votre redirection.

Ce n’est finalement pas plus compliqué que ça ! Grâce à ces quelques conseils, vous devriez désormais être capable de mettre rapidement en place un raccourcisseur d’URL efficace.

Et n’oubliez pas que la taille compte, plus que jamais !

---

UPDATE 03/02/2011 – 10:26

Comme me le suggèrent @_pakal_ et @jkbockstael sur Twitter, j’aurais très bien pu utiliser un système en base 62 (chiffres arabes + les 26 lettres de l’alphabet en minuscule et en majuscule). J’avoue ne pas l’avoir fait car les URL sensibles à la casse m’ont toujours fait un peu peur. Je sais que les serveurs Windows ne les gèrent pas bien. Et il faut également s’assurer que la DB MySQL soit case sensitive. A priori, en étant méticuleux, ça ne posera pas de soucis majeurs. La démarche générale reste la même que celle expliquée plus haut et nos URL raccourcies seront encore plus courtes ! Quelques exemples par ici.

12 Comments

  1. Miguel Coimbra's avatar Miguel Coimbra says:

    Merci Vinch pour ta petite explication … Toujours agréable à lire !!!!

    A+
    MC

    Like

  2. Hello Vinch!

    Sympa cet article sur les URL shorteners, c’est un peu mon dada aussi comme tu le sais… 🙂

    Pour info j’avais fait à l’époque un shortener base-36, avec un tutoriel pour en créer un gratuitement sur Heroku en quelques minutes: https://github.com/njacobeus/shortenr

    Le code est dispo ici: https://github.com/njacobeus/shortenr/blob/master/shortenr.rb (14 lignes de ruby ;-))

    (j’utilise ça pour Belighted avec l’URL http://bl.ht)

    Nicolas

    Like

  3. vinch's avatar Vinch says:

    Sympa ! J’avoue que mon code PHP est plus long (environ 50 lignes réparties sur 3 fichiers) mais en l’optimisant à fond, je pourrais sans doute virer une bonne vingtaine de lignes 😉
    Je publierai sans doute le code dans un prochain post.

    Like

  4. Jérôme's avatar Jérôme says:

    cette approche a quand même le gros défaut de donner des URLs prévisibles, ce qui entraine du coup la question de la “privacité” des URLs ainsi partagées…. N’importe qui peut passer en revue toutes les urls que X ou Y aura partagé avec son shortener.

    Ca n’est en général pas bien grave, mais tout le monde n’en est pas forcément conscient 🙂

    my 2 cents,
    J.

    Like

  5. vinch's avatar Vinch says:

    J’en étais conscient, j’ai hésité à en parler mais je me suis finalement abstenu, car comme tu dis, ce n’est pas bien grave. L’inconvénient également est qu’on peut savoir très facilement combien d’URL ont été générées via le shortener. Pas de bol pour le marketeux qui aime bien exagérer le succès de son service.

    Like

  6. Geoffray's avatar Geoffray says:

    Salut ! Vraiment un super article ! Cependant, tu parles de 6 millions de possibilités pour un hash en 5 caractères, or il me semble que 36^5 font plus de 60 millions… en calculant de tête évidemment 😉

    Like

  7. vinch's avatar Vinch says:

    Tu as raison, j’ai oublié un zéro. J’ai vérifié avec ma calculatrice.

    Like

  8. Geoffray's avatar Geoffray says:

    Ton article m’a donné envie d’explorer la base 62 et d’autres bases encore plus grandes avec PHP.J’ai écrit un petit billet là dessus : http://www.geoffray.be/blog/php/convertir-des-nombres-en-base-62
    A+

    Like

  9. Rosetatie's avatar Rosetatie says:

    Euhhhhh, et si on parlait français, beau et accessible à tous?
    Ou presque.
    Vincent, c’est quoi ton code PNP qui est plus long?
    Plus long que quoi?
    Non mais, ça me fout les boules de vous lire…
    Y a pas moyen de vous envoyer des messages privés?
    Ta famille va s’inquiéter…
    Et moi aussi: pour les autistes, j’ai donné et je ne veux pas que ça vous contamine.
    Franchement, je préfère aller voir ce qui se passe en Algérie, oui, Algérie!
    Et les Abruzzes, ce serait pas bien d’y aller demain?

    Like

  10. Rosetatie's avatar Rosetatie says:

    tu m’étonnes!

    Like

  11. Martin's avatar Martin says:

    Sinon, tu peux aussi utiliser bit.ly pro (http://bit.ly/a/pro_request
    ). C’est gratuit “up to 10,000 shorten requests a day” …

    Ceci dit, ça n’enlève rien à l’intérêt de l’article… .

    Like

Leave a reply to PaKaL Cancel reply