Qt-创建一个基于时间的UUID

Qt - Create a time-based UUID

本文关键字:时间 UUID 于时间 一个 创建 Qt-      更新时间:2023-10-16

我想在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;