--- title: Savez-vous compter en hexatridécimal ? featureImage: ar://i38VjG116bH9flXnGObXuyyOzD8i4lcaRBHLNTEkD2E excerpt: language: fr tags: authors: --- Le [**système hexatridécimal**](http://en.wikipedia.org/wiki/Base_36) 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](https://www.webmonkey.com/color-codes/)). 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](http://twitter.com) (qui a d’ailleurs [son propre raccourcisseur d’URL](https://help.twitter.com/en/using-twitter/url-shortener)). ![36](ar://i38VjG116bH9flXnGObXuyyOzD8i4lcaRBHLNTEkD2E) En 2009, [nous](http://1md.be) avions lancé un raccourcisseur d’URL pour **smart**, la célèbre marque de voitures compactes. Vous pouviez à l'époque le trouver sur [oym.be](http://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](http://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](http://sho.rt/1)** sera notre première URL générée (1 en base 36 reste 1) * **[http://sho.rt/a](http://sho.rt/a)** sera notre dixième URL générée (10 en base 36 vaut a) * **[http://sho.rt/2s](http://sho.rt/2s)** sera notre centième URL générée * **[http://sho.rt/rs](http://sho.rt/rs)** sera notre millième URL générée * **[http://sho.rt/7ps](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()`](http://php.net/manual/fr/function.base-convert.php) 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()`](http://php.net/manual/fr/function.mysql-insert-id.php) 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 plusieurs personnes 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](http://www.google.com/search?q=url+shortener+base+62).