Re: UUID v7

From: "Andrey M(dot) Borodin" <x4mmm(at)yandex-team(dot)ru>
To: Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>
Cc: Sergey Prokhorenko <sergeyprokhorenko(at)yahoo(dot)com(dot)au>, Jelte Fennema-Nio <postgres(at)jeltef(dot)nl>, Michael Paquier <michael(at)paquier(dot)xyz>, Aleksander Alekseev <aleksander(at)timescale(dot)com>, pgsql-hackers mailing list <pgsql-hackers(at)postgresql(dot)org>, Peter Eisentraut <peter(at)eisentraut(dot)org>, Przemysław Sztoch <przemyslaw(at)sztoch(dot)pl>, "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, Mat Arye <mat(at)timescaledb(dot)com>, Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com>, Nikolay Samokhvalov <samokhvalov(at)gmail(dot)com>, Junwang Zhao <zhjwpku(at)gmail(dot)com>, Stepan Neretin <sncfmgg(at)gmail(dot)com>
Subject: Re: UUID v7
Date: 2024-11-25 18:14:55
Message-ID: 69C5D857-C057-46C6-A94B-FA0F9F2DCCC9@yandex-team.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

> On 25 Nov 2024, at 22:53, Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com> wrote:
>
> In the following code, we use "defined(__darwin__) || defined(_MSC_VER)":
>
> +#if defined(__darwin__) || defined(_MSC_VER)
> +#define SUBMS_MINIMAL_STEP_BITS 10
> +#else
> +#define SUBMS_MINIMAL_STEP_BITS 12
> +#endif
> #define SUBMS_BITS 12
> -#define SUBMS_MINIMAL_STEP_NS ((NS_PER_MS / (1 << SUBMS_BITS)) + 1)
> +#define SUBMS_MINIMAL_STEP_NS ((NS_PER_MS / (1 <<
> SUBMS_MINIMAL_STEP_BITS)) + 1)
>
> on the other hand, we use "defined(__darwin__) || defined(WIN32)" here:
>
> +#if defined(__darwin__) || defined(WIN32)
> + /*
> + * On MacOS real time is truncted to microseconds. Thus, 2 least
> + * significant are dependent on other time-specific bits, thus
> they do not
> + * contribute to uniqueness. To make these bit random we mix in two bits
> + * from CSPRNG.
> + *
> + * SUBMS_MINIMAL_STEP is chosen so that we still guarantee monotonicity
> + * despite altering these bits.
> + */
> + uuid->data[7] = uuid->data[7] ^ (uuid->data[8] >> 6);
> +#endif
>
> Is there a reason for using different macros?

No, that's an oversight. We should mix these 2 bits if an only if SUBMS_MINIMAL_STEP_BITS=10.

<tldr>
In your review change_v33.patch you used WIN32, but it did not actually compile on Windows.
So on Saturday I squashed v33+change_v33.patch, and composed a message that I think we still should switch to _MSC_VER. And just before sending I received your message with v36 where you used _MSC_VER :)

I think this way:
_MSC_VER - native Windows without clock_gettime, we used gettimeofday() and 10 bits of sub-ms.
MinGW - we use clock_gettime() and 12 bits.
Darwin - we use clock_gettime() and 10 bits.
Anything else - clock_gettime() and 12 bits.
</tldr>

>
> In get_real_time_ns_ascending(), we use _MSC_VER so we use
> clock_gettime() on MinGW.
>
>>
>> Sergey Prokhorenko just draw my attention to the new release of MariaDB [0]. They are doing very similar UUID v7 generation as we do [1].
>>
>
> Thank you for the references. It made me think that we can use the
> function name uuid_v7() rather than uuidv7().

I think it's a good idea if we will be kind of SQL-compatible.

Best regards, Andrey Borodin.

In response to

  • Re: UUID v7 at 2024-11-25 17:53:24 from Masahiko Sawada

Responses

  • Re: UUID v7 at 2024-11-25 20:11:55 from Masahiko Sawada

Browse pgsql-hackers by date

  From Date Subject
Next Message Kirill Reshke 2024-11-25 18:17:06 Use streaming read API in pgstattuple.
Previous Message Masahiko Sawada 2024-11-25 17:53:24 Re: UUID v7