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;