如何使用 C++ 產生 UUID / GUID

寫程式時常常會需要用到 UUID 來當作唯一的鍵值。例如觀察者模式中,觀察者訂閱主題時,主題類別可以回傳一個 UUID 給觀察者保存,觀察者用此 UUID 取消訂閱,可以解決有些觀察者類別不能比較,因此無法用來搜尋並取消訂閱的問題。

以下簡單介紹使用 boost.uuid 函式庫:

#include <boost/uuid/uuid.hpp> // 為了宣告 uuid 型別
#include <boost/uuid/random_generator.hpp> // 為了產生 uuid

boost::uuids::uuid id = boost::uuids::random_generator()();

如果對 boost::uuids::random_generator()() 這行 code 感到陌生,這其實是呼叫 boost::uuids::random_generator() 建構實體,再呼叫成員函式 operator() 的意思,等同下面兩行 code:

boost::uuids::random_generator g;
boost::uuids::uuid id = g();

boost::uuids::uuid 是一個 POD 型別,內含成員變數 uint8_t data[16],設計成 POD 型別表示可以使用 memset 或 memcpy 等函式,效率好。

也可以將 boost::uuids::uuid 轉換成 std::string:

#include <boost/uuid/uuid_io.hpp> // to_string

boost::uuids::uuid id = boost::uuids::random_generator()();
auto s = boost::uuids::to_string(id);

下圖為產生的 UUID:

UUID

最後要提醒的一點是,boost.uuid 廢棄了 name_generator 的使用,因為 MD5SHA1 已經被攻破。