Autor en Google+
Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET, ASP.NET Core, MVC, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

10 años online 🎂

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET, ASP.NET Core, MVC, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
sábado, 28 de diciembre de 2013
GUID Colliding SequenceLos GUID (Globally Unique Identifier) son una serie de 16 bytes generados pseudoaleatoriamente que se suelen utilizar para identificar de forma única objetos, dispositivos, componentes, o prácticamente cualquier cosa. Y, a diferencia de otros tipos de identificadores, el “única” debe ser interpretado de forma global, es decir, es virtualmente imposible que un GUID utilizado para un elemento se repita en otro equipo, lugar o sistema.

No hay magia negra en esto, es pura matemática. El número de combinaciones posibles es 2128; dicho así no parecen demasiadas, pero para que os hagáis una idea de las magnitudes, serían algo así como 3.400.000.000.000.000.000.000.000.000.000.000.000.000 valores distintos, número arriba o número abajo ;-). Si os parece difícil que os toque la lotería, supongo que podréis intuir lo poco probable que es que existan colisiones si decidimos seleccionar un GUID, por ejemplo, como campo clave en filas de una base de datos, o como nombres de fichero que queremos asegurar que sean únicos. Y así lo hemos hecho durante años.

Y todos los que los usamos seguiríamos tan felices si no fuera por ese pequeño matiz que he deslizado al comienzo del post: la pseudoaleatoriedad del algoritmo de generación utilizado, que va a provocar un colapso el próximo 11 de febrero debido al efecto denominado GUID Colliding Sequence.

Este efecto, que ocurre cada 999.999.999 segundos, de hecho ya apareció el 4 de junio de 1982 y afectó a algunos microordenadores y mainframes de la época. Por ejemplo, el famoso Spectrum se vio afectado y tuvieron que retirar todas las unidades un mes después de salir al mercado, y lo mismo ocurrió con el célebre IBM 3081, cuyos problemas de funcionamiento llegaron a tambalear a la industria tabaquera estadounidense, donde estaban muy implantados.

Números aleatoriosEl problema se debe, básicamente, a un error en la definición del algoritmo para generación de GUIDs recogida por el estándar definido en la RFC 4122 que podéis leer aquí. Como se ver en el texto (pág 10), el almacén utilizado para guardar el número de intervalos de cien nanosegundos transcurridos desde las 0:00:00 del 15 de octubre de 1582 utiliza valores de 60 bits, y con un poco de calculadora veréis que el próximo 11 de febrero se llegará al valor máximo permitido antes de producirse de nuevo un overflow. Y combinando esto con el resto de elementos que se tienen en cuenta para generar los identificadores y las operaciones lógicas que se realizan entre ellos, existe más de un 92% de probabilidades de que los GUID generados dicho día colisionen entre sí.

Bueno, ¿y qué podemos hacer? Pues aparte de cruzar los dedos, la OMC (Organización Mundial del Comercio) recomienda observar, entre otras, las siguientes precauciones antes y durante el 11 de febrero. Algunas recomendaciones van dirigidas a profesionales de nuestro sector, y otras a los usuarios en general:
  • Modificar todas las aplicaciones que usen GUIDs para identificar elementos, de forma que dejen de asumir su unicidad universal. Se recomienda crear factorías que, antes de retornar el control a funciones de orden superior, comprueben en un bucle la no existencia previa de los identificadores generados, volviendo a generar un GUID distinto cuando se detecte una colisión.
  • Programar turnos de vigilancia de los sistemas, especialmente las bases de datos, durante las 24 horas del 11 de febrero. Programar alertas o triggers que nos avisen de duplicidades e inconsistencias en la información manejada.
  • No publicar contenidos en blogs y redes sociales, pues habitualmente se referencian con un GUID (Twitter, Facebook, Pinterest y Yammer han confirmado este extremo) y podrían perderse.
  • Por la misma razón, tampoco es recomendable subir archivos a servicios en la nube como Google Drive, Skydrive, Dropbox, Instagram o Picasa.
  • No realizar compras, ni movimientos bancarios, ni, en general, transacciones que puedan estar almacenándose internamente utilizando GUIDs, porque podrían no guardarse correctamente y podría volatilizarse el dinero.
  • No fabricar dispositivos que puedan utilizar GUIDs como identificadores únicos, como las direcciones MAC de las tarjetas de red o pens USB. Es decir, lo mejor es parar las fábricas.
  • No iniciar procedimientos administrativos para evitar pérdidas de información, como presentar documentación en un Ayuntamiento, o justificantes en Hacienda. Otra consecuencia, aunque esta vez positiva, es que una multa de tráfico registrada ese día podría no llegarnos jamás, pues la DGT (Dirección General de Tráfico de España) utiliza GUIDs como identificadores ;-)
  • No usar firma electrónica, puesto que el hash puede contener trazas reconocibles y reproducibles por otros usuarios para realizar firmas en nuestro nombre.
  • No adquirir participaciones de lotería o sorteos que sean generadas en máquinas expendedoras, pues podría darse el caso de que a todos los jugadores se asignen los mismos números y tendríamos que repartir los beneficios con un buen puñado de gente.
  • … estas son las más destacables, pero podéis leer la lista completa en la web de la OMC.
Como curiosidad adicional, deciros que esto no pasaría de ser un puro problema técnico similar al ya vivido en el año 2000 si no fuera porque hace unos años el Consejo Europeo de Organizaciones Escépticas  (sí, los mismos que ofrecieron un millón de dólares a quien demostrara tener poderes paranormales), ofrecieron la nada despreciable cantidad de quinientos mil euros a quien demostrara un caso real de repetición de un GUID. Si detectáis una duplicidad no dejéis de hacérsela llegar, porque podéis llevaros una buena alegría, aunque podréis imaginar también la que se va a liar en el buzón de correo de esta gente el 11 de febrero ;-DD

La siguiente vez que ocurra será el viernes 20 de octubre de 2045. A saber dónde andamos para entonces, así que, de momento, mejor preocuparnos exclusivamente por el problema que se avecina en un par de meses.

¡Suerte y mucho ojo!

Fuentes:
Publicado en Variable not found con GUID 8deda7b6-021d-4c5f-8929-89eb40a73a91.

[Actualizado 30/12]
Nota para despistadillos: obviamente la noticia no es real, se trata simplemente de una broma del Día de los Inocentes. El próximo 11 de febrero podéis seguir usando GUIDs, fabricando dispositivos,  comprando por internet, usando la firma electrónica y participando en sorteos. Ah, y las multas de tráfico os llegarán a casa, no os confiéis :-DDD

Estos contenidos se publican bajo una licencia de Creative Commons Licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 España de Creative Commons

10 Comentarios:

El Bruno dijo...

jajaja q cabrón !!!

Jesús Velasco dijo...

Ostras... El Guid que te ha asignado el blog para el post es el mismo que tiene mi usuario en la membresía de mi aplicación (me lo sé de memoria porque es más fácil acordarse del Guid que de mi username :-)

Anónimo dijo...

Jajajajaja ya ha comenzado!!

Anónimo dijo...

Que grande, me ha encantado. Hasta he mirado si me tocaba trabajar ese día.

Omar del Valle dijo...

No se te acaban las historias eh? jajaja.. :)

Joacim Andersson dijo...

I don't speak Spanish so maybe something got lost in the Google translation, but how can you claim that there was a problem with the IBM 3081 back in 1982 because of some pore implementation of the RFC 4122, when that wasn't proposed as a standard until July 2005? The same goes for the ZX Spectrum which was also an early 80s computer. Do you have any references to this "facts", because Google can't find any references to them?

Besides the most common GUIDs today use version 4 RFC 4122 GUIDs which are random and not time based so a collision wouldn't just happen simply because it happens to be February 11.

José M. Aguilar dijo...

@joacin, don't worry, it's just a joke. In Spain, we have the "april fool's day" on 28th december ("día de los inocentes").

Joacim Andersson (MVP) dijo...

Oh, I see... Well, I guess you managed to make me look like a fool. :)

José M. Aguilar dijo...

@joacim Let's say innocent :D

Happy new year!

Juver Paredes dijo...

Añadir un simple dato como fecha/hora.../milisegundos y solucionado el problema ;)