UUIDv7: Timestamps aren’t time-ordered and other oddities
UUIDv7 часто рекламируют за три свойства: монотонно возрастающие идентификаторы, встроенная метка времени создания и невозможность угадать ID. На деле ни одно из них строго не гарантируется. Единственное, что UUIDv7 действительно обеспечивает, — уникальность и устойчивость к коллизиям. Остальное зависит от конкретной реализации, и разные совместимые с RFC 9562 генераторы могут нарушать эти свойства вплоть до крайности.
Главная причина — свобода, которую RFC даёт разработчикам. Спецификация прямо разрешает изменять поле метки времени и не требует, чтобы оно совпадало с реальным временем: «реализации МОГУТ увеличивать метку времени опережая фактическое время». Это нужно для поддержания монотонности при переполнении счётчика. Яркий пример — стандартная библиотека Python: если часы системы откатятся назад, генератор может «застрять» и уйти вперёд по времени на произвольную величину, пока реальные часы не догонят его. Тогда метка перестаёт отражать момент создания объекта, а при долгом отставании начинаются переполнения счётчика.
Практический вывод: UUIDv7 — это смесь идей, а не набор гарантий. При выборе реализации стоит спрашивать, какие свойства она реально обещает, при каких условиях и как сильно её ID поддаются угадыванию.