]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: Add `ha_generate_uuid_v7`
authorTim Duesterhus <tim@bastelstu.be>
Fri, 19 Apr 2024 19:01:26 +0000 (21:01 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 24 Apr 2024 06:23:56 +0000 (08:23 +0200)
This function generates a version 7 UUID as per
draft-ietf-uuidrev-rfc4122bis-14.

include/haproxy/tools.h
src/tools.c

index cbce218dc68a373c2e3a1e38044c377c54fc7077..4e1a6dfa3f869059d30103adc30db18b8e8d3422 100644 (file)
@@ -1057,6 +1057,7 @@ int parse_dotted_uints(const char *s, unsigned int **nums, size_t *sz);
 
 /* PRNG */
 void ha_generate_uuid_v4(struct buffer *output);
+void ha_generate_uuid_v7(struct buffer *output);
 void ha_random_seed(const unsigned char *seed, size_t len);
 void ha_random_jump96(uint32_t dist);
 uint64_t ha_random64(void);
index f3b095569ad7b5298b29ede9b836018dc3a79133..114cbf6ddf1dfa07e0a00d11873c82c3ed350b95 100644 (file)
@@ -5605,6 +5605,31 @@ void ha_generate_uuid_v4(struct buffer *output)
                     (long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull);
 }
 
+/* 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);
+}
+
 
 /* only used by parse_line() below. It supports writing in place provided that
  * <in> is updated to the next location before calling it. In that case, the