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).

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 :
- http://sho.rt/1 sera notre première URL générée (1 en base 36 reste 1)
- http://sho.rt/a sera notre dixième URL générée (10 en base 36 vaut a)
- http://sho.rt/2s sera notre centième URL générée
- http://sho.rt/rs sera notre millième URL générée
- http://sho.rt/7ps sera notre dix millième URL générée
- etc.
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.
Merci Vinch pour ta petite explication … Toujours agréable à lire !!!!
A+
MC
LikeLike
Likes!
LikeLike
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
LikeLike
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.
LikeLike
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.
LikeLike
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.
LikeLike
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 😉
LikeLike
Tu as raison, j’ai oublié un zéro. J’ai vérifié avec ma calculatrice.
LikeLike
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+
LikeLike
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?
LikeLike
tu m’étonnes!
LikeLike
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… .
LikeLike