Qt - 创建一个基于时间的 UUID
Qt - Create a time-based UUID
我想在 Qt 中创建 v1 UUID(基于时间)
我尝试使用 cppuuid 但无法获得正确的 uuid
我也试过 ossp uuid 但在构建时出错,我更愿意避免使用它
我需要最简单快捷的方法在Qt中生成这样的uuid(我更喜欢Qt class,如果有的话)
我希望 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条件
// 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;
我想在 Qt 中创建 v1 UUID(基于时间)
我尝试使用 cppuuid 但无法获得正确的 uuid 我也试过 ossp uuid 但在构建时出错,我更愿意避免使用它
我需要最简单快捷的方法在Qt中生成这样的uuid(我更喜欢Qt class,如果有的话)
我希望 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条件
// 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;