簡體   English   中英

生成唯一的序列ID

[英]Generate unique sequence ID

如何生成一個唯一的序列ID以存儲在unsigned long中? 在1970年之后經過幾秒鍾就好了,但要求在一秒鍾之內,id可能會更新,所以第二個不會是獨一無二的!

除非您提供有關您的要求的更多信息,否則很難得出答案:

unsigned long next_id = 0;

unsigned long new_id() {
    return next_id++;
}

如果您的要求是選擇偽隨機,快速,可靠的獨特內容,而不是用於加密安全目的的要求,我提供以下內容

在Windows X86上:

__rdtsc() - 與序列號一樣好。 使用較低的32位對返回值的高32位進行異或。 因為較低的32位將每隔幾秒循環一次

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <intrin.h>
#include <stdint.h>

uint32_t GetPseudoRandomNumber()
{
    uint64_t t = _time64(NULL);
    uint64_t cpu = __rdtsc();
    uint32_t result;
    cpu = cpu ^ t;
    result = (cpu >> 32) ^ (cpu & 0xffffffff);
    return result;
}

uint32_t GetPseudoRandomNumber2()
{
    GUID guid = {};
    uint32_t* pValue = (uint32_t*)&guid;
    uint32_t result;

    CoCreateGuid(&guid);

    result = pValue[0] ^ pValue[1] ^ pValue[2] ^ pValue[3];

    return result;
}

其他熵源包括GetTickCount()(毫秒特有)

在Linux上:只需從/ dev / urandom中讀取4個字節

使用1970年后經過的毫秒數

嘗試使用: srand ( time(NULL) );

如何生成unique_ids是一個有用的問題 - 但是你似乎生成它們的時候做了一個反效果的假設!

我的觀點是,您在創建行時不需要生成這些唯一ID,因為它們基本上與所插入的數據無關。

我所做的是預先生成獨特的id以供將來使用,這樣我就可以享受自己的甜蜜時光並絕對保證它們是獨一無二的,並且在插入時無需進行任何處理。

例如,我有一個order_id的訂單表。 當用戶輸入訂單時,會立即生成此ID,永久遞增1,2,3等。 用戶無需查看此內部標識。

然后我有另一個表 - unique_ids與(order_id,unique_id)。 我有一個每天晚上運行的例程,它會為此表預加載足夠多的unique_id行,以覆蓋可能在接下來的24小時內插入的訂單。 (如果我在一天內獲得10000個訂單,我就會遇到問題 - 但這將是一個很好的問題!)

這種方法保證了唯一性,並且可以將任何處理負載從插入事務轉移到批處理例程中,而不會影響用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM