我正在使用静态库;它有一个使用当前时间并创建唯一ID的函数,然后将其插入到我的数据库中。这个数字在我的数据库表中应该是唯一的。
有两个进程并行运行。有时它们会同时调用此函数,并生成相同的数字。发生这种情况时,我会违反完整性。
我正在考虑使用进程ID,线程ID和当前时间。这种组合是独一无二的吗?
平台:Windows XP
答案 0 :(得分:10)
使用数据库生成它们。如何做到这一点取决于数据库,但Postgres将它们称为序列。
答案 1 :(得分:5)
如果程序同时运行,则进程/线程ID将是唯一的,因为操作系统需要区分它们。但系统确实重用了id。 所以,对于你的情况,是的,将一个进程ID或线程id添加到你的标记中是一个好主意,所以我认为你不需要两者。
答案 2 :(得分:5)
在Windows上,线程ID在整个系统中都是唯一的。请参阅此MSDN库文章:
http://msdn.microsoft.com/en-us/library/ms686746%28v=VS.85%29.aspx
CreateThread和CreateRemoteThread函数还返回一个标识符,该标识符唯一标识整个系统中的线程。线程可以使用GetCurrentThreadId函数来获取自己的线程标识符。标识符从创建线程到线程终止之间有效。请注意,没有线程标识符将为0。
答案 3 :(得分:3)
遗憾的是,进程ID,线程ID和时间的组合并不保证是唯一的。一旦他们引用的线程和进程终止,OS就可以重用进程ID和线程ID。此外,用户可以将时钟设置回来,因此同一时间发生两次。正如其他人所说,我会向数据库询问一个唯一的ID。 Oracle有序列,MySQL有自动增量列,其他数据库有相似的机制。
答案 4 :(得分:1)
虽然进程ID和线程ID将是唯一的,但最好使用数据库为您生成唯一ID(如R. Pate建议的那样),只是因为您可能会限制您的可伸缩性,除非您还包括独特的机器ID ...
尽管在机器A上运行的某个进程可能与在机器B上运行的进程之一具有相同的进程ID和线程ID,但这些错误最终会让人们起床凌晨4点来处理支持电话......
答案 5 :(得分:0)
好吧,添加进程ID和线程ID可能会导致相同的数字
pid = 100,tid = 104 pid = 108,tid = 96
不太可能,但可能。
因此,对于近乎安全的ID,您至少需要64位ID字段,如
ULONG64 id = ((ULONG64)(pid&0xffff) << 48) | ((ULONG64)(tid&0xffff) << 32) | (timestamp & 0xffffffff);
(但是,这仍然不能保证唯一性,因为它假设线程ID不会与进程ID重叠,它们会中和16位值,但我认为我没有看到超过65536的PID,除非你创建了数千个线程,在时间戳跳转之前,线程ID不会在此值中回转。)