在其他語言中,例如 Go,有無數的庫可用于創建全域唯一的 ID 字串(使用諸如納秒時間、機器 ID、行程 ID、隨機位元組等元素...)
但是,在 C 中,唯一真正的選擇似乎是 UUID(例如來自 Boost 的)
我希望在我的代碼中使用全域唯一識別符號,但不希望字符數與 UUID 一樣多。
作為 GoLang 中可用事物型別的示例。請參閱以下內容。在 C 中有類似的東西嗎?
https://blog.kowalczyk.info/article/JyRZ/generating-good-unique-ids-in-go.html
uj5u.com熱心網友回復:
請注意,當我說“盡可能多的字符”時,我指的是 UUID 的字串表示
因此,也許使用您自己的表示。
你沒有具體說明很多。請記住,時間聚類可能會導致安全漏洞1。我假設 UUIDv4 標準,即 16 個位元組。讓我們使用看起來很短的鏈接頁面的編碼:
住在 Coliru
#include <boost/lexical_cast.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <cstring>
#include <iostream>
#include <string_view>
using boost::uuids::uuid;
static_assert(uuid::static_size() == 16);
static constexpr auto alphabet57 =
"23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
std::string encode57(uuid uid) {
boost::uint128_type num;
std::reverse(uid.data, uid.data 16);
std::memcpy(&num, uid.data, 16);
std::string s;
s.reserve(12);
while (num) {
s = alphabet57[num % 57];
num /= 57;
}
return s;
}
uuid decode57(std::string_view s) {
boost::uint128_type num = 0;
for (auto it = s.rbegin(); it != s.rend(); it) {
num *= 57;
num = std::find(alphabet57, alphabet57 57, *it) - alphabet57;
}
uuid uid;
std::memcpy(uid.data, &num, 16);
std::reverse(uid.data, uid.data 16);
return uid;
}
int main() {
for (std::string test : {
"f7dd5274-f457-4239-a881-801662d589ad", // sfitJnfge8vaXnga8kzi7n
"3b387615-24ed-4c17-a715-c4413ffac3b5", // Vq6uZe6usvSwWftVdBPbYC
"3dd64dba-1ff3-40e5-84e3-3fbb0f8b86b9", // r5D3drtfrx7322ajzYv82D
"b17a848e-5d6b-45d9-ae25-57cfb8a8fec3", // petYHah9W3p8GptQ9QJuaZ
"a9edc682-147c-4e41-85e2-e06c4ce64086", // DFLa6tquGSZvSEi2WE3MFY
"2cc90c4a-192f-4b57-bc11-2c322dab2ce0", // yyg6AekktrpjdBCjGjsCy9
"ac1d94bd-3fbc-46c1-aeec-cdcdc2dd0dd2", // dzHCNTADG6R4n3QTjm7XdY
"1e3df271-a3c2-4b45-8871-0fde4c2d97e8", // tL66L6gqRESaABWsxbrhP7
"0d15c1d5-3646-474f-8a5d-989878f12a95", // FtnvH2QRENpsFcLXq5zhL4
"ececc5dc-cdf1-49f4-b3f7-bfe8697133fd", // Dkfm7JmgVAuP28JLPDBnAk
}) //
{
auto const uid = boost::lexical_cast<uuid>(test);
auto const txt = encode57(uid);
std::cout << uid << " ~ " << txt << "\n";
assert(decode57(txt) == uid);
}
}
印刷
f7dd5274-f457-4239-a881-801662d589ad ~ sfitJnfge8vaXnga8kzi7n
3b387615-24ed-4c17-a715-c4413ffac3b5 ~ Vq6uZe6usvSwWftVdBPbYC
3dd64dba-1ff3-40e5-84e3-3fbb0f8b86b9 ~ r5D3drtfrx7322ajzYv82D
b17a848e-5d6b-45d9-ae25-57cfb8a8fec3 ~ petYHah9W3p8GptQ9QJuaZ
a9edc682-147c-4e41-85e2-e06c4ce64086 ~ DFLa6tquGSZvSEi2WE3MFY
2cc90c4a-192f-4b57-bc11-2c322dab2ce0 ~ yyg6AekktrpjdBCjGjsCy9
ac1d94bd-3fbc-46c1-aeec-cdcdc2dd0dd2 ~ dzHCNTADG6R4n3QTjm7XdY
1e3df271-a3c2-4b45-8871-0fde4c2d97e8 ~ tL66L6gqRESaABWsxbrhP7
0d15c1d5-3646-474f-8a5d-989878f12a95 ~ FtnvH2QRENpsFcLXq5zhL4
ececc5dc-cdf1-49f4-b3f7-bfe8697133fd ~ Dkfm7JmgVAuP28JLPDBnAk
1 這些都是基于 RFC4122 亂數的 UUID 的示例,這是在 Go 中使用 goolge/uuid 時的默認設定
這些編碼已經通過生成的編碼進行了驗證 shortuuid
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/346371.html
下一篇:std::vector和移動語意
