uuid.NewV7() теряет случайность в браузереВ трекере Go появился любопытный баг: новый стандартный пакет
uuid, который должен приехать в Go 1.27, на таргете js/wasm генерирует «бракованные» UUIDv7 — часть случайных бит всегда оказывается нулевой.🌸 Как повторить
Вызвать
uuid.NewV7().String() и собрать программу под js/wasm (например, GOOS=js GOARCH=wasm go run main.go через Node). В результате на свет стабильно появляются значения такого вида:019ee60f-29b3-7000-a12b-f817e25db8f4
019ee610-29c7-7000-bc34-f04bc09150bb
019ee610-2eb4-7000-884a-dfcad78e47d9
Обратите внимание на третий блок — он всегда
7000. Меняется только timestamp в начале и хвост, а вот этот фрагмент будто прибит гвоздями.❓ Почему 7000 — это проблема
Чтобы понять, что именно сломано, полезно вспомнить структуру UUID версии 7. Внутри 128 бит лежат:
48 бит — Unix-таймстамп в миллисекундах;
4 бита — номер версии (0111, то есть 7);
12 бит — случайные данные (rand_a);
2 бита — вариант (10);
62 бита — случайные данные (rand_b).
В строковом виде
019ee60f-29b3-7000-... блок 7000 — это как раз версия (7) плюс те самые 12 бит rand_a. И вот эти 12 бит вместо случайных стабильно равны нулю — 000.Страдает именно 12-битное поле
rand_a. Это сужает круг подозреваемых — где-то на пути заполнения этого конкретного куска случайными байтами на js/wasm что-то идёт не так.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive