Hi Tim!
On Fri, Apr 19, 2024 at 09:01:26PM +0200, Tim Duesterhus wrote:
> +/* Generates a draft-ietf-uuidrev-rfc4122bis-14 version 7 UUID into chunk
> + * <output> which must be at least 37 bytes large.
> + */
> +void ha_generate_uuid_v7(struct buffer *output)
> +{
> + uint32_t rnd[3];
> + uint64_t last;
> + uint64_t time;
> +
> + time = (date.tv_sec * 1000) + (date.tv_usec / 1000);
> + last = ha_random64();
> + rnd[0] = last;
> + rnd[1] = last >> 32;
> +
> + last = ha_random64();
> + rnd[2] = last;
> +
> + chunk_printf(output, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx",
> + (uint)(time >> 16u),
> + (uint)(time & 0xFFFF),
> + ((rnd[0] >> 16u) & 0xFFF) | 0x7000, // highest 4 bits
> indicate the uuid version
> + (rnd[1] & 0x3FFF) | 0x8000, // the highest 2 bits
> indicate the UUID variant (10),
> + (long long)((rnd[1] >> 14u) | ((uint64_t) rnd[2] << 18u))
> & 0xFFFFFFFFFFFFull);
> +}
Just thinking about all the shifts above, I think you could have
gone through less efforts by acting on 64-bit randoms (less shifts).
But the difference is probably not that much anyway.
In any case, that looks good and I've merged it now. Many thanks!
Willy