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

Reply via email to