mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-29 17:42:54 +00:00
MINOR: tools: add a generic function to generate UUIDs
We currently have two UUID generation functions, one for the sample fetch and the other one in the SPOE filter. Both were a bit complicated since they were made to support random() implementations returning an arbitrary number of bits, and were throwing away 33 bits every 64. Now we don't need this anymore, so let's have a generic function consuming 64 bits at once and use it as appropriate.
This commit is contained in:
parent
aa8bbc12dd
commit
ee3bcddef7
@ -1551,6 +1551,7 @@ static inline void *my_realloc2(void *ptr, size_t size)
|
||||
int parse_dotted_uints(const char *s, unsigned int **nums, size_t *sz);
|
||||
|
||||
/* PRNG */
|
||||
void ha_generate_uuid(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();
|
||||
|
@ -257,33 +257,8 @@ static const char *spoe_appctx_state_str[SPOE_APPCTX_ST_END+1] = {
|
||||
static char *
|
||||
generate_pseudo_uuid()
|
||||
{
|
||||
char *uuid;
|
||||
uint32_t rnd[4] = { 0, 0, 0, 0 };
|
||||
uint64_t last = 0;
|
||||
int byte = 0;
|
||||
uint8_t bits = 0;
|
||||
unsigned int rand_max_bits = my_flsl(RAND_MAX);
|
||||
|
||||
if ((uuid = calloc(1, 37)) == NULL)
|
||||
return NULL;
|
||||
|
||||
while (byte < 4) {
|
||||
while (bits < 32) {
|
||||
last |= (uint64_t)ha_random() << bits;
|
||||
bits += rand_max_bits;
|
||||
}
|
||||
rnd[byte++] = last;
|
||||
last >>= 32u;
|
||||
bits -= 32;
|
||||
}
|
||||
snprintf(uuid, 37, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx",
|
||||
rnd[0],
|
||||
rnd[1] & 0xFFFF,
|
||||
((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version
|
||||
(rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10),
|
||||
(long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull
|
||||
);
|
||||
return uuid;
|
||||
ha_generate_uuid(&trash);
|
||||
return trash.area;
|
||||
}
|
||||
|
||||
|
||||
|
25
src/sample.c
25
src/sample.c
@ -3328,30 +3328,7 @@ static int smp_check_uuid(struct arg *args, char **err)
|
||||
static int smp_fetch_uuid(const struct arg *args, struct sample *smp, const char *kw, void *private)
|
||||
{
|
||||
if (args[0].data.sint == 4 || !args[0].type) {
|
||||
uint32_t rnd[4] = { 0, 0, 0, 0 };
|
||||
uint64_t last = 0;
|
||||
int byte = 0;
|
||||
uint8_t bits = 0;
|
||||
unsigned int rand_max_bits = my_flsl(RAND_MAX);
|
||||
|
||||
while (byte < 4) {
|
||||
while (bits < 32) {
|
||||
last |= (uint64_t)ha_random() << bits;
|
||||
bits += rand_max_bits;
|
||||
}
|
||||
rnd[byte++] = last;
|
||||
last >>= 32u;
|
||||
bits -= 32;
|
||||
}
|
||||
|
||||
chunk_printf(&trash, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx",
|
||||
rnd[0],
|
||||
rnd[1] & 0xFFFF,
|
||||
((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version
|
||||
(rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10),
|
||||
(long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull
|
||||
);
|
||||
|
||||
ha_generate_uuid(&trash);
|
||||
smp->data.type = SMP_T_STR;
|
||||
smp->flags = SMP_F_VOL_TEST | SMP_F_MAY_CHANGE;
|
||||
smp->data.u.str = trash;
|
||||
|
@ -4640,6 +4640,31 @@ void ha_random_jump96(uint32_t dist)
|
||||
}
|
||||
}
|
||||
|
||||
/* Generates an RFC4122 UUID into chunk <output> which must be at least 37
|
||||
* bytes large.
|
||||
*/
|
||||
void ha_generate_uuid(struct buffer *output)
|
||||
{
|
||||
uint32_t rnd[4];
|
||||
uint64_t last;
|
||||
|
||||
last = ha_random64();
|
||||
rnd[0] = last;
|
||||
rnd[1] = last >> 32;
|
||||
|
||||
last = ha_random64();
|
||||
rnd[2] = last;
|
||||
rnd[3] = last >> 32;
|
||||
|
||||
chunk_printf(output, "%8.8x-%4.4x-%4.4x-%4.4x-%12.12llx",
|
||||
rnd[0],
|
||||
rnd[1] & 0xFFFF,
|
||||
((rnd[1] >> 16u) & 0xFFF) | 0x4000, // highest 4 bits indicate the uuid version
|
||||
(rnd[2] & 0x3FFF) | 0x8000, // the highest 2 bits indicate the UUID variant (10),
|
||||
(long long)((rnd[2] >> 14u) | ((uint64_t) rnd[3] << 18u)) & 0xFFFFFFFFFFFFull);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* c-indent-level: 8
|
||||
|
Loading…
Reference in New Issue
Block a user