-- some quick and dirty field extraction functions
-- this is actually timestamp concatenated with clock sequence, per RFC 4122 CREATE FUNCTION uuid_timestamp_bits(uuid) RETURNS varbit AS
$$ SELECT ('x' || substr($1::text, 15, 4) || substr($1::text, 10, 4) ||
substr($1::text, 1, 8) || substr($1::text, 20, 4))::bit(80)
& x'0FFFFFFFFFFFFFFF3FFF' $$
LANGUAGE SQL STRICT IMMUTABLE;
CREATE FUNCTION uuid_version_bits(uuid) RETURNS varbit AS
$$ SELECT ('x' || substr($1::text, 15, 2))::bit(8) & '11110000' $$
LANGUAGE SQL STRICT IMMUTABLE;
CREATE FUNCTION uuid_reserved_bits(uuid) RETURNS varbit AS
$$ SELECT ('x' || substr($1::text, 20, 2))::bit(8) & '11000000' $$
LANGUAGE SQL STRICT IMMUTABLE;
CREATE FUNCTION uuid_multicast_bit(uuid) RETURNS bool AS
$$ SELECT (('x' || substr($1::text, 25, 2))::bit(8) & '00000001') != '00000000' $$
LANGUAGE SQL STRICT IMMUTABLE;
CREATE FUNCTION uuid_local_admin_bit(uuid) RETURNS bool AS
$$ SELECT (('x' || substr($1::text, 25, 2))::bit(8) & '00000010') != '00000000' $$
LANGUAGE SQL STRICT IMMUTABLE;
CREATE FUNCTION uuid_node(uuid) RETURNS text AS
$$ SELECT substr($1::text, 25) $$
LANGUAGE SQL STRICT IMMUTABLE;
-- Ideally, the multicast bit would never be set in V1 output, but the -- UUID library may fall back to MC if it can't get the system MAC address. -- Also, the local-admin bit might be set (if so, we're probably inside a VM). -- So we can't test either bit here. SELECT uuid_version_bits(uuid_generate_v1()),
uuid_reserved_bits(uuid_generate_v1());
-- Although RFC 4122 only requires the multicast bit to be set in V1MC style -- UUIDs, our implementation always sets the local-admin bit as well. SELECT uuid_version_bits(uuid_generate_v1mc()),
uuid_reserved_bits(uuid_generate_v1mc()),
uuid_multicast_bit(uuid_generate_v1mc()),
uuid_local_admin_bit(uuid_generate_v1mc());
-- timestamp+clock sequence should be monotonic increasing in v1 SELECT uuid_timestamp_bits(uuid_generate_v1()) < uuid_timestamp_bits(uuid_generate_v1()); SELECT uuid_timestamp_bits(uuid_generate_v1mc()) < uuid_timestamp_bits(uuid_generate_v1mc());
-- Ideally, the node value is stable in V1 addresses, but OSSP UUID -- falls back to V1MC behavior if it can't get the system MAC address. SELECTCASEWHEN uuid_multicast_bit(uuid_generate_v1()) AND
uuid_local_admin_bit(uuid_generate_v1()) THEN true-- punt, no test ELSE
uuid_node(uuid_generate_v1()) = uuid_node(uuid_generate_v1())
END;
-- In any case, V1MC node addresses should be random. SELECT uuid_node(uuid_generate_v1()) <> uuid_node(uuid_generate_v1mc()); SELECT uuid_node(uuid_generate_v1mc()) <> uuid_node(uuid_generate_v1mc());
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.