sábado, 13 de diciembre de 2008

Compresión de Fecha para Identificador

En cierta ocasión requerí un procedimiento para obtener identificadores de transaccion únicos en un ambiente distribuido. Existieron ciertas atenuantes que me hicieron más sencilla la planeación del proceso, como el hecho de que los nombres de red y de usuarios de los equipos son rigurosamente controlados, razón por la cual yo podía despreocuparme completamente de ello, e incluso utilizarlos como parte de la creación del identificador.

Se me ocurrieron varios métodos pero en todos ellos se incurría en una probabilidad de colisión de identificador (colisión = repetición). Una limitante que sí tenía era que este identificador único debía caber en solo 12 caracteres, PERO..., no podía utilizar 4 de esos caracteres porque contienen caracteres que son absolutamente necesarios para la identificación de la transacción, así que me quedaban solo 8.

Pensando y pensado, se me ocurrió que podría utilizar una fecha en formato DD-MM-YY-HH:MI:SS (sin los guiones ni los dos puntos) añadiendo además 2 números al azar. Pensé también en utilizar números al azar para el identificador completo pero lo deseché puesto que la fecha es mucho más descriptiva para mis fines.

Asi pues teniendo la siguiente fecha: 13120811341763, me inventé un procedimiento para dejarla de 14 en tan solo 8 caracteres y quedó así luego de la "compresión" : Y0KS4hm

¿Se ve difícil la cosa eh?, pues no lo es tanto. ¿Recuerdas los números hexadecimales?. Pues bien, recordarás que el 12 decimal se expresa como una simple C. Como verás... allí nos ahorramos un dígito ya que necesitamos solo un caracter para escribir un número de dos caracteres. Utilizando eso como base la idea se trata de realizar un cambio de base decimal a otro de manera que el resultado caiga en la utilización de menos caracteres.

En mi caso utilicé un "sistema numérico" de base 55, los caracteres fueron: del 0 al 9, de la A a la Z y posteriormente en minúsculas hasta llegar a un total de 55. De esa manera, al convertir la "fecha" expresada en base decimal pero contenida en una cadena (13120811341763) a otro número en base 55 contenido también en una cadena el resultado es la misma cadena pero "comprimida".