BDE 4.14.0 Production release
|
Provide functions that produce Globally Unique Identifiers.
This component provides a struct
, bdlb::GuidUtil
, that serves as a namespace for utility functions that create and work with Globally Unique Identifiers (GUIDs).
Note that all the GUIDs generated by this component are actually Universally Unique Identifiers (UUIDs), which are a type of GUID. The two terms will be used interchangeably in the documentation below.
This conversion performed by guidFromString
is intended to be used for GUIDs generated by external sources that have a variety of formats.
GuidUtil
provides three families of functions for generating GUIDs: generate
, generateNonSecure
, and generateFromName
. The generate
and generateNonSecure
methods use random number generators, with the slower generate
methods aiming to produce cryptographically secure UUIDs by accessing underlying system resources to obtain truly random numbers, and the faster generateNonSecure
methods using a fast high-quality (but not strictly cryptographically secure) in-process random-number generator.
The generateFromName
method does not use random numbers, but produces a UUID deterministically based on a given name and namespace. The user should heed the following admonition in RFC 4122: "Do not assume that UUIDs are
hard to guess; they should not be used as security capabilities (identifiers
whose mere possession grants access), for example." In addition, applications that generate name-based UUIDs from untrusted inputs must not assume that such UUIDs will be unique, since collision attacks are already known against the SHA-1 hash algorithm.
Suppose we are building a system for managing records for employees in a large international firm. These records have no natural field which can be used as a unique ID, so a GUID must be created for each employee.
First let us define a value-type for employees.
For the sake of brevity, we provide a limited amount of data in each record. We additionally show a very limited scope of functionality.
Next, we create free functions operator<
and operator==
to allow comparison of MyEmployee
objects. We take advantage of the monotonically increasing nature of sequential GUIDs to implement these methods.
Next, we create some employees:
Finally, we verify that the generated GUIDs are unique.