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