Comments 10
Не знаток go. В коде везде знаковые целые и сдвиг на знаковое целое. В go с этим не бывает проблем? В C лучше для этого использовать беззнаковые типы.
А так, вы правы, в го с ними то же, что и в си.
Разве?.. Вижу вот такое:
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 не разбираюсь, тем не менее спрошу - почему вы используете цикл по битам с установкой отдельных бит вместо битовой маски? С маской, теоретически любая операция будет выполняться быстрее, и вероятно, компилятор сможет оптимизировать нулевые маски.
Ну так-то 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
В общем, есть некоторая небрежность. :)
Надеяться, что они уйдут от этой манеры, сложно. Но адеюсь, что они при этом сохранят деление на стандартный набор 5 полей.
Двигаем биты — или как реализовать свой стандарт UUID