M-am lovit zilele trecute de o problemă ciudată: trebuia să generez un cod de culoare unic pentru fiecare nume de utilizator al unui sistem oarecare.

Soluţia la care am apelat este la fel de ciudată:

select
  conv(round((
    conv(substr(md5(name), 1, 6), 16, 10)
    conv(substr(md5(name), 7, 6), 16, 10)
    conv(substr(md5(name), 13, 6), 16, 10)
    conv(substr(md5(name), 19, 6), 16, 10)
    conv(substr(md5(name), 25, 6), 16, 10)
  ) / 5), 10, 16) as color
from tabela

Aşadar, am selectat numele de utilizator peste care am aplicat metoda md5() din MySQL. Rezultatul funcţiei este un şir unic de 32 de caractere hexazecimale. Am spart apoi acest şir în 5 grupe de câte 6 caractere, am convertit rezultatul din baza 16 în baza 10 şi am făcut o medie aritmetică între cele 5 valori obţinute. Rezultatul l-am convertit apoi în baza 16 şi am obţinut codul de culoare dorit.

Probabil că soluţia nu este cea mai rapidă, dar funcţionează, ba mai mult, aduce rezultatul dintr-un singur apel MySQL, fără altă procesare pe server.

Algoritmul poate fi îmbunătăţit prin valorificarea ultimelor două cifre hexazecimale rămase (am folosit primele 5 grupe de câte 6 cifre). Eventual, numărul format din ele poate fi adăugat la rezultatul obţinut, având grijă ca acesta să nu depăşească maximul FFFFFF.

Posibilităţile sunt multiple.