Qt-创建一个基于时间的UUID
Qt - Create a time-based UUID
我想在Qt 中创建v1 UUID(基于时间)
我尝试使用cppuuid,但无法获得正确的uuid我也尝试过ossp-uuid,但在构建时出错了,我更喜欢避免使用它
我需要最简单、最短的方法在Qt中生成这样的uuid(如果有的话,我更喜欢Qt类)
我希望v1 uuid将其用作我的数据库中的主键
参见//https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/
我按如下方式尝试了cppuuid
qulonglong v1 = 0x19432987;
qulonglong v2= 0x33;
uuid::Uuid u = uuid::uuid1( v1,v2 );
QByteArray uuid = QByteArray().append( QString::fromStdString( u.hex()));
qDebug() << "uuid size" << uuid.size(); // 25
qDebug() << "uuid" << uuid;
qDebug() << "uuid hex" << uuid.toHex();
qDebug() << "uuid hex size" << uuid.toHex().size(); //50
编辑:我已经找到了cppuuid给出错误结果的原因,详细信息在我的答案
使用由本地随机数生成器播种的QUuid::createUuid
。您可以使用qsrand(time())
或类似的种子。
我在cppuuid中发现了一个逻辑错误,导致了奇怪的结果。
cppuuid中的gettime函数如下:
static uint64_t gettime()
{
static uint64_t last_uuid_time = 0; // On the heap!
int rc = 0;
struct timespec tp;
uint64_t uuid_time = 0;
rc = clock_gettime(CLOCK_REALTIME, &tp);
// Convert to 100-nanosecond intervals
uuid_time = tp.tv_sec * 10000000;
uuid_time = uuid_time + (tp.tv_nsec / 100);
uuid_time = uuid_time + kNum_100nsec_1582_1970;
// If the clock looks like it went backwards, or is the same, increment it.
if (last_uuid_time <= uuid_time) {
uuid_time = last_uuid_time + 1;
}
last_uuid_time = uuid_time;
return uuid_time;
}
如果条件,则登录错误在此中
// If the clock looks like it went backwards, or is the same, increment it.
if (last_uuid_time <= uuid_time) {
uuid_time = last_uuid_time + 1;
}
<=
应该是
>=
现在cppuuid给出了正确的结果。希望这能帮助
uuid::Uuid u = uuid::uuid1(0x19432987, 0x33);
QByteArray uuid = QByteArray().append( QString::fromStdString( u.hex()));
qDebug() << "uuid size" << uuid.size(); // 32
qDebug() << "uuid" << uuid;
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- Qt-创建一个基于时间的UUID
- 使用c++语言以时间戳作为输入生成V4 UUID