生成唯一的序列ID
Generate unique sequence ID
如何生成一个存储在无符号长中的唯一序列ID?在1970年之后获得秒数是个好主意,但要求在一秒钟内id可能会更新,所以秒数不会是唯一的!
除非您提供更多有关需求的信息,否则很难找到除之外的答案
unsigned long next_id = 0;
unsigned long new_id() {
return next_id++;
}
如果您的需求是选择伪随机、快速、可靠、唯一的东西,并且不用于crytographic安全目的,我提供以下
在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_id是一个有用的问题,但当生成它们时,您似乎对做出了适得其反的假设!
我的观点是,在创建行时不需要生成这些唯一的id,因为它们本质上独立于插入的数据。
我所做的是预先生成唯一的id以供将来使用,这样我就可以享受自己的甜蜜时光,并绝对保证它们是唯一的,而且在插入时不需要进行任何处理。
例如,我有一个订单表,里面有order_id。这个id是在用户输入订单时动态生成的,增量为1、2、3等等。用户不需要查看此内部id。
然后我有了另一个表unique_ids,其中包含(order_id,unique_id)。我有一个每晚运行的例程,它预加载这个表,其中有足够的unique_id行,足以覆盖未来24小时内可能插入的订单。(如果我在一天内收到10000个订单,我会遇到问题——但这将是一个很好的问题!)
这种方法保证了唯一性,并将任何处理负载从插入事务转移到批处理例程中,而不会影响用户。
- 通过组合不同的类型来创建唯一的id
- 编译时检查特征专用化是否具有唯一 ID
- tbb:current_unordered_map()-向量中每个唯一元素的ID
- 如何实现唯一 id 队列,其中元素可以在 C++ 中"bumped"到顶部?
- 我可以使用Qt线程ID为每个线程创建唯一的缓存吗?
- 如何在链表中生成唯一 ID?
- constexpr 唯一 ID,使用 clang 编译,但不使用 GCC 编译
- 可以为实体生成 8 字节的唯一 ID
- 您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
- 运行Yocto的嵌入式系统的唯一ID
- 唯一的 10 位序列 ID - 200 个 ID/秒
- c++需要字符串的唯一ID,但无论顺序如何都必须相同
- 驱动器/分区和Windows API中唯一的驱动器ID
- 三维空间中的体素唯一ID
- C++:通过进程id、进程句柄和标题名称从进程中获取唯一窗口的窗口句柄的最佳方法
- 获取在同一查询中创建的行的唯一 ID
- 生成可以区分 ID(Foo::a()) 和 ID(Foo::b()) 的唯一标识符
- 通过C++在Windows上的唯一CPU ID
- 正在生成唯一的Windows操作系统ID
- 如何在编译时生成密集的唯一类型ID