生成唯一的序列ID

时间:2011-06-16 07:32:12

标签: c++ algorithm

如何生成一个唯一的序列ID以存储在unsigned long中? 在1970年之后过了几秒钟本来是个好主意,但要求是在一秒钟之内,id可能会更新,所以第二个不会是唯一的!

5 个答案:

答案 0 :(得分:7)

除非您提供有关您的要求的更多信息,否则很难得出答案:

unsigned long next_id = 0;

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

答案 1 :(得分:1)

如果您的要求是选择伪随机,快速,可靠的独特内容,而不是用于加密安全目的的要求,我提供以下内容

在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个字节

答案 2 :(得分:0)

使用1970年后经过的毫秒数

答案 3 :(得分:0)

尝试使用:srand ( time(NULL) );

答案 4 :(得分:0)

如何生成unique_ids是一个有用的问题 - 但是当你生成它们时,你似乎正在对进行反效果假设!

我的观点是,您在创建行时不需要生成这些唯一ID,因为它们基本上与所插入的数据无关。

我所做的是预先生成唯一ID以供将来使用,这样我就可以享受自己的美好时光并绝对保证它们是独一无二的,并且在插入时无法完成任何处理。

例如,我有一个带有order_id的订单表。当用户输入订单时,会立即生成此ID,永久递增1,2,3等。用户无需查看此内部ID。

然后我有另一个表 - unique_ids with(order_id,unique_id)。我有一个每天晚上运行的例程,它会为此表预加载足够多的unique_id行,以覆盖可能在接下来的24小时内插入的订单。 (如果我在一天内获得10000份订单,​​我就会遇到问题 - 但这将是一个很好的问题!)

这种方法保证了唯一性,并且可以将任何处理负载从插入事务转移到批处理例程中,而不会影响用户。