Hello, I’m Vinch

And this is my blog.

Savez-vous compter en hexatridécimal ?

02/03/11

This post is more than 3 years old. It might not reflect my current skills and convictions.

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 :

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

12 comments

Leave a comment