2015-11-19 29 views
1

我想創建V1 UUID(基於時間)在Qt的的Qt - 創建一個基於時間的UUID

我嘗試使用cppuuid,但不能得到正確的UUID 我也試過ossp uuid但同時建設了錯誤,我寧願避免使用也無妨

我需要最簡單的和短期的方式來生成Qt的這種UUID(我喜歡的Qt類,如果有的話)

我想V1 UUID的使用它作爲我的主要關鍵d atabase

看到//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是給錯誤的結果,細節都在我的答案

回答

0

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

使用QUuid::createUuid它由本地隨機數發生器播種。你可以用qsrand(time())或類似的東西種子。