- Se está debatiendo en GitHub una propuesta para incluir en la biblioteca estándar del lenguaje Go funciones de generación y parseo de UUID
- El autor de la propuesta señala como fundamento que actualmente la mayoría de los proyectos de servidores y bases de datos en Go dependen de paquetes externos como github.com/google/uuid
- Lenguajes principales como C#, Java y Python ya ofrecen soporte de UUID a nivel de biblioteca estándar
- Durante la discusión, los principales puntos en debate incluyen especificaciones recientes como UUIDv7, el cumplimiento de RFC 9562, el alcance de las funciones de parseo y la consistencia de la API
- Más adelante, esta propuesta se integró en la propuesta de soporte para UUIDv4 y UUIDv7 en el paquete crypto/rand (#76319), que sigue en curso
Resumen de la propuesta
- Se plantea agregar a la biblioteca estándar de Go una API de generación y parseo de UUID
- Las versiones objetivo son UUID v3, v4 y v5
- Los principales argumentos son la dependencia de paquetes externos y los casos de soporte estándar en otros lenguajes
- UUID es un estándar internacional definido en RFC 4122 (más tarde RFC 9562)
- El proponente señala que Go es un caso excepcional entre los lenguajes principales al no contar con soporte estándar para UUID
Reacciones iniciales y discusión
- Algunos participantes mencionaron que ya hubo propuestas similares en el pasado, pero fueron rechazadas (#23789, #28324)
- La razón fue que usar paquetes externos es suficientemente sencillo y que su ciclo de publicación es más flexible que el de la biblioteca estándar
- El proponente argumenta que “si la mayoría de los proyectos tienen que importar siempre un paquete externo, entonces sería mejor incluirlo en el estándar”
- También se presentó como argumento a favor que muchos lenguajes incluyen UUID en una biblioteca estándar relacionada con crypto
Versiones más recientes de UUID y adopción del RFC
- Algunas opiniones señalan que UUID v1~v5 ya están desactualizados y que v7 es la versión más reciente y prometedora
- v7 tiene varias opciones de implementación, por lo que sería necesario observar sus resultados en la práctica
- En el borrador del RFC se recomienda no parsear UUID innecesariamente y tratarlos como identificadores opacos
- Después de la publicación oficial de RFC 9562, la discusión relacionada pasó a centrarse en el soporte para UUIDv7
Revisión y fusión de la propuesta
- En 2025, tras oficializarse RFC 9562, apareció una mención de que PostgreSQL 18 soporta UUIDv7
- Más adelante, del lado de Go se abrió una propuesta separada para agregar únicamente funciones de generación de UUIDv4 y UUIDv7 al paquete crypto/rand (#76319)
- Las funciones de parseo quedaron excluidas siguiendo la recomendación del RFC
- La propuesta original (#62026) fue cerrada por considerarse duplicada (duplicate)
Discusión sobre el diseño de la API
- Se discutió si el comportamiento predeterminado de
uuid.New() debería ser v4 o si debería dejar abierta la posibilidad de cambios futuros
- Algunos propusieron fijarlo siempre en v4, advirtiendo que cambiar la versión en el futuro podría causar problemas de compatibilidad
- También se debatió si debían ofrecerse métodos como
Compare, MustParse y Parse
- Sobre
Compare, hubo opiniones de que es necesario para soportar UUID ordenables, conforme a la definición del RFC
MustParse se incluiría para mantener consistencia con otras funciones Must* de la biblioteca estándar
- Se concluyó que el método
IsZero() no es necesario para el tipo UUID
- Se propusieron varias ideas de diseño, como introducir una estructura
Generator o separar tipos por versión (UUIDv4, UUIDv7, etc.)
- Algunos señalaron la ambigüedad de la función
New() y propusieron ofrecer solo funciones de versión explícita (NewV4, NewV7)
Principales temas técnicos
- Se discutió si la definición de ordenamiento de UUID (sorting) existe con claridad solo para v6 y v7
- También se revisaron métodos para implementar la garantía de orden temporal al generar UUIDv7 y la prevención de colisiones en concurrencia (mediante contador)
- Se señaló que las diferencias semánticas entre versiones (por ejemplo, v1 incluye dirección MAC y v7 se basa en tiempo) muestran los límites de un diseño con un único tipo
- Algunos propusieron separar tipos por versión e incorporar métodos de conversión explícitos como
AsV4() y AsV7()
Conclusión y estado actual
- En la comunidad de Go existe un consenso general sobre la necesidad de soporte estándar para UUID
- Sin embargo, para mantener la simplicidad de la biblioteca estándar y respetar las recomendaciones del RFC, se definió la siguiente dirección:
- excluir las funciones de parseo
- agregar solo funciones de generación de UUIDv4 y UUIDv7 a crypto/rand
- La propuesta original (#62026) fue integrada en la propuesta #76319 y sigue en curso,
por lo que el soporte estándar de UUID en el lenguaje Go parece estar cerca de una etapa de formalización
1 comentarios
Opiniones en Hacker News
Me pareció interesante que dijeran que las UUID versión 1~5 ya están obsoletas
Pero v4 sigue teniendo la mayor aleatoriedad y se recomienda como clave primaria para evitar problemas de hotspot y cuestiones de privacidad en bases de datos distribuidas
Enlaces de referencia: documentación de UUID de CockroachDB, guía de UUID de Google Cloud Spanner
Cada versión de UUID, incluida v4, tiene defectos en ciertos contextos. De hecho, muchas organizaciones usan valores puros de 128 bits definidos por ellas mismas en lugar de UUID estándar
Al final, han aparecido muchos requisitos complejos que superan las limitaciones de diseño de UUID
Me alegra ver hoy en HN una noticia pequeña sobre Go
Últimamente todo gira en torno al futuro de la programación o a la IA, así que este tipo de tema técnico se siente fresco
Los perfeccionistas, los desarrolladores de campo y la comunidad crypto tienen posturas distintas
Documento relacionado: RFC 9562
Espero que Go tome la decisión correcta. En especial TinyGo es realmente genial para microcontroladores
No me importa mucho que Go soporte la generación de UUID, pero que exista un tipo UUID estándar sí es realmente importante
Permitirá un marshaling consistente en JSON, Text, database/sql, etc.
En un análisis reciente de dependencias de Go, google/uuid fue el segundo paquete más usado
Análisis relacionado: The most popular Go dependency
El atractivo de Go está en la practicidad más que en las funciones llamativas
El lenguaje no se vuelve tan complejo como para romperse, y solo agrega lo necesario
Gracias a la garantía de compatibilidad se puede usar con tranquilidad. Los cambios son lentos, pero es un lenguaje que mejora de forma constante
Más que el hecho de que el paquete uuid de Google esté inactivo, creo que lo importante es que gofrs/uuid sigue el nuevo estándar y se mantiene activamente
repositorio de gofrs/uuid
issue #194
Realmente odio las UUID. Son identificadores poco amigables para las personas
Son demasiado largas e incómodas para depurar o ver resultados de consultas.
Claro, sirven cuando necesitas IDs únicos entre sistemas completamente separados, pero en la mayoría de los casos se abusa de ellas
En casos normales, un generador centralizado de números es mucho mejor.
Por ejemplo, un procedimiento como GetNextId en la base de datos es más humano y más eficiente
El resultado fue un código imposible de leer para humanos y, para colmo, era una implementación propia extrañamente secuencial. Fue una decisión terrible
En Postgres, usando una tabla de contadores, puedes generar decenas de miles de IDs por segundo
Así también mejoras el ahorro de memoria, la eficiencia de compresión y el rendimiento del hashmap
UUID es conveniente, pero arruina el rendimiento
Por ejemplo, algo como
BASKETBALL-...-FISH, agregando un checksum basado en palabras para que sea más fácil de recordarMe preguntaba si UUID realmente se va a agregar a Go
Si no hay objeciones importantes, es muy probable que se incluya
Kotlin también agregó recientemente en la versión 2.3 el soporte de versiones UUID basado en RFC 9562 a su biblioteca estándar
Es compatible con JVM, JS, WASM y Native.
Ahora que el IETF RFC ya está estabilizado, tiene sentido que Go también lo adopte
Es una lástima que Go tenga este tipo de carencias en soporte básico
En lo personal, el sistema de logging de Go me parece demasiado simple y tuve que implementarlo por mi cuenta
El módulo slog es lento e incómodo. Parece pensado solo para entornos enterprise
Me puse a pensar si habría una forma de obtener al mismo tiempo la eficiencia de clustering en DB de v7 y la aleatoriedad de v4
Tal vez se pueda usar v7 internamente y, al enviarlo hacia afuera, mezclarlo con XOR o AES
Por ejemplo, usando cifrado Feistel puedes crear IDs públicos opacos sin los problemas de rendimiento de UUID