From b2eb84f8ca2fc2b8a2af6cd2c54c0abc4535cfc4 Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Fri, 29 Apr 2011 07:19:22 +0200 Subject: Substantial simplification of uuid_t The string format of UUID is not used in 0MQ. Further on, it turns out that UUIDs have fixed microarchitecture-agnostic binary layout (see RFC4122). Thus, the conversion to string and back to binary can be avoided. Signed-off-by: Martin Sustrik --- src/uuid.cpp | 193 ++++++++--------------------------------------------------- 1 file changed, 25 insertions(+), 168 deletions(-) (limited to 'src/uuid.cpp') diff --git a/src/uuid.cpp b/src/uuid.cpp index d8cc2e8..02f716e 100644 --- a/src/uuid.cpp +++ b/src/uuid.cpp @@ -18,56 +18,32 @@ along with this program. If not, see . */ +#include + #include "uuid.hpp" #include "err.hpp" +#include "stdint.hpp" +#include "platform.hpp" #if defined ZMQ_HAVE_WINDOWS -zmq::uuid_t::uuid_t () -{ - RPC_STATUS ret = UuidCreate (&uuid); - zmq_assert (ret == RPC_S_OK); - ret = UuidToString (&uuid, &string_buf); - zmq_assert (ret == RPC_S_OK); - - create_blob (); -} - -zmq::uuid_t::~uuid_t () -{ - if (string_buf) - RpcStringFree (&string_buf); -} +#include -const char *zmq::uuid_t::to_string () +void zmq::generate_uuid (void *buf_) { - return (char*) string_buf; + RPC_STATUS ret = UuidCreate ((::UUID*) buf_); + zmq_assert (ret == RPC_S_OK); } #elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD -#include #include -zmq::uuid_t::uuid_t () +void zmq::generate_uuid (void *buf_) { uint32_t status; - uuid_create (&uuid, &status); + uuid_create ((::uuid_t*) buf_, &status); zmq_assert (status == uuid_s_ok); - uuid_to_string (&uuid, &string_buf, &status); - zmq_assert (status == uuid_s_ok); - - create_blob (); -} - -zmq::uuid_t::~uuid_t () -{ - free (string_buf); -} - -const char *zmq::uuid_t::to_string () -{ - return string_buf; } #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS ||\ @@ -75,159 +51,40 @@ const char *zmq::uuid_t::to_string () #include -zmq::uuid_t::uuid_t () +void zmq::generate_uuid (void *buf_) { - uuid_generate (uuid); - uuid_unparse (uuid, string_buf); - - create_blob (); -} - -zmq::uuid_t::~uuid_t () -{ -} - -const char *zmq::uuid_t::to_string () -{ - return string_buf; + uuid_generate ((unsigned char*) buf_); } #elif defined ZMQ_HAVE_OPENVMS #include -#define uuid_generate(x) sys$create_uid(&(x)) - -#define uuid_unparse(x, y) \ - sprintf (y, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", \ - x.data0, x.data1, x.data2, \ - x.data3 [0], x.data3 [1], \ - x.data3 [2], x.data3 [3], \ - x.data3 [4], x.data3 [5], \ - x.data3 [6], x.data3 [7]); - -zmq::uuid_t::uuid_t () -{ - uuid_generate (uuid); - uuid_unparse (uuid, string_buf); -} - -zmq::uuid_t::~uuid_t () -{ -} - -const char *zmq::uuid_t::to_string () +void zmq::generate_uuid (void *buf_) { - return string_buf; + sys$create_uid(buf_); } #else -#include -#include #include -zmq::uuid_t::uuid_t () +void zmq::generate_uuid (void *buf_) { - unsigned char rand_buf [16]; - int ret = RAND_bytes (rand_buf, sizeof rand_buf); + unsigned char *buf = (unsigned char*) buf_; + + // Generate random value. + int ret = RAND_bytes (buf, 16); zmq_assert (ret == 1); - // Read in UUID fields. - memcpy (&time_low, rand_buf, sizeof time_low); - memcpy (&time_mid, rand_buf + 4, sizeof time_mid); - memcpy (&time_hi_and_version, rand_buf + 6, sizeof time_hi_and_version); - memcpy (&clock_seq_hi_and_reserved, rand_buf + 8, - sizeof clock_seq_hi_and_reserved); - memcpy (&clock_seq_low, rand_buf + 9, sizeof clock_seq_low); - memcpy (&node [0], rand_buf + 10, sizeof node); - - // Store UUID version number. - time_hi_and_version = (time_hi_and_version & 0x0fff) | 4 << 12; - - // Store UUID type. - clock_seq_hi_and_reserved = (clock_seq_hi_and_reserved & 0x3f) | 0x80; - - snprintf (string_buf, sizeof string_buf, - "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", - time_low, - time_mid, - time_hi_and_version, - clock_seq_hi_and_reserved, - clock_seq_low, - node [0], node [1], node [2], node [3], node [4], node [5]); - - create_blob (); -} + // Set UUID variant to 2 (UUID as specified in RFC4122). + const unsigned char variant = 2; + buf [8] = (buf [8] & 0x3f) | (variant << 6); -zmq::uuid_t::~uuid_t () -{ -} - -const char *zmq::uuid_t::to_string () -{ - return string_buf; + // Set UUID version to 4 (randomly or pseudo-randomly generated UUID). + const unsigned char version = 4; + buf [6] = (buf [6] & 0x0f) | (version << 4); } #endif -const unsigned char *zmq::uuid_t::to_blob () -{ - return blob_buf; -} - -unsigned char zmq::uuid_t::convert_byte (const char *hexa_) -{ - unsigned char byte; - - if (*hexa_ >= '0' && *hexa_ <= '9') - byte = *hexa_ - '0'; - else if (*hexa_ >= 'A' && *hexa_ <= 'F') - byte = *hexa_ - 'A' + 10; - else if (*hexa_ >= 'a' && *hexa_ <= 'f') - byte = *hexa_ - 'a' + 10; - else { - zmq_assert (false); - byte = 0; - } - - byte *= 16; - - hexa_++; - if (*hexa_ >= '0' && *hexa_ <= '9') - byte += *hexa_ - '0'; - else if (*hexa_ >= 'A' && *hexa_ <= 'F') - byte += *hexa_ - 'A' + 10; - else if (*hexa_ >= 'a' && *hexa_ <= 'f') - byte += *hexa_ - 'a' + 10; - else - zmq_assert (false); - - return byte; -} - -void zmq::uuid_t::create_blob () -{ - const char *buf = (const char*) string_buf; - - blob_buf [0] = convert_byte (buf + 0); - blob_buf [1] = convert_byte (buf + 2); - blob_buf [2] = convert_byte (buf + 4); - blob_buf [3] = convert_byte (buf + 6); - - blob_buf [4] = convert_byte (buf + 9); - blob_buf [5] = convert_byte (buf + 11); - - blob_buf [6] = convert_byte (buf + 14); - blob_buf [7] = convert_byte (buf + 16); - - blob_buf [8] = convert_byte (buf + 19); - blob_buf [9] = convert_byte (buf + 21); - - blob_buf [10] = convert_byte (buf + 24); - blob_buf [11] = convert_byte (buf + 26); - blob_buf [12] = convert_byte (buf + 28); - blob_buf [13] = convert_byte (buf + 30); - blob_buf [14] = convert_byte (buf + 32); - blob_buf [15] = convert_byte (buf + 34); -} -- cgit v1.2.3