Pull to refresh

Comments 10

Не знаток go. В коде везде знаковые целые и сдвиг на знаковое целое. В go с этим не бывает проблем? В C лучше для этого использовать беззнаковые типы.

Знаковые целые использовались для совместимости с другими реализациями UUID. А так, вы правы, в го с ними то же, что и в си. Да и во всех других нормальных языках.
А так, вы правы, в го с ними то же, что и в си.

Разве?.. Вижу вот такое:


For signed integers, the operations +, -, *, /, and << may legally overflow and the resulting value exists and is deterministically defined by the signed integer representation, the operation, and its operands. Overflow does not cause a run-time panic. A compiler may not optimize code under the assumption that overflow does not occur. For instance, it may not assume that x < x + 1 is always true.

А в С ряд операций (включая сдвиг влево) с знаковыми целыми может приводить к UB.

В go не разбираюсь, тем не менее спрошу - почему вы используете цикл по битам с установкой отдельных бит вместо битовой маски? С маской, теоретически любая операция будет выполняться быстрее, и вероятно, компилятор сможет оптимизировать нулевые маски.

Потому что это реализация для демонстрации как оно устроено. Она про максимальную понятность, а не про максимальную скорость.

Если это чисто для демонстрации, искренее непонятно, зачем нужны были все эти усилия по ручным манипуляциям внутри 16 байт и разговоры про выравнивание в конце.

Про максимальную понятность без потери скорости

Ну так-то UUIDv7 выглядит очень интересно, с одним маленьким но. В коде-примере, на который вы ссылаетесь, в том числе в процитированных вами участках есть подтверждённый баг https://github.com/uuid6/uuid6go-proto/issues/11

А в тестовой площадке http://www.new-uuid.info/ UUID выводится в непривычном формате:

0619e37bae-0471-009c-d959-222d3225e4

тогда как в остальных местах дефисы ставятся иначе:

0619e37b-ae04-7100-9cd9-59222d3225e4

В общем, есть некоторая небрежность. :)

Баг скоро закомичу. И сайт обновлю, если честно, не заметил проблемы с сайтом. Спасибо за коммент. Ждите обновлений.
С порядком бит/байт, боюсь, вы не разберётесь однозначно. Хранить все части UUID, кроме последней, в платформенном порядке это типовая манера кое-где, и GUID в LE стандартизован, например, для GPT.
Надеяться, что они уйдут от этой манеры, сложно. Но адеюсь, что они при этом сохранят деление на стандартный набор 5 полей.
Sign up to leave a comment.