公式生成一个唯一的ID?

时间:2009-04-13 14:33:54

标签: guid uniqueidentifier

我想在不使用GUID的情况下获得关于生成唯一ID的一些想法。最好我希望唯一值是int32类型。

我正在寻找可以用于数据库主键以及网址友好的东西。

这些可以被视为独特吗?

  1. (int)DateTime.Now.Ticks
  2. (int)DateTime.Now * RandomNumber
  3. 还有其他想法吗?

    由于

    编辑:我正在尝试练习域驱动设计,我的所有实体在创建时都需要有一个ID才有效。理论上我可以调用DB来获得一个自动递增的数字,但是当DB相关的东西进入域时,我宁愿避开这个。

3 个答案:

答案 0 :(得分:4)

这取决于您需要的独特之处以及您需要提供ID的项目数量。你最好的选择可能是顺序分配它们;如果你试图想象你可能会遇到生日悖论(碰撞比你想象的更可能)或者(如你的情况1)上面的那些被限制你发行它们的速度。

对于大多数情况,上面的1)比2)好一点;它的速率有限 - 每个刻度不能发出超过1个ID - 但不会受到生日悖论的影响。你的2)只是扔掉了一点。使用随机数可能稍微好一点XOR,但无论如何我不认为兰特会给你买任何东西,只是隐藏问题&使其更难修复。

答案 1 :(得分:1)

  
    

这些被认为是全球唯一吗?

  
     

1)(int)DateTime.Now.Ticks 2)   (int)DateTime.Now * RandomNumber

这两种选择都不是全球唯一的。

选项1 - 如果您可以保证每个刻度不会生成多个ID,则此选项是唯一的。从你的描述来看,这听起来并不合适。

选项2 - 随机数是伪随机数,但不保证是唯一的。考虑到这一点,我们可以将此选项的DateTime部分减少为与选项1类似的问题。

如果您想要一个全局唯一的ID,这是一个int32,一种好方法是返回顺序ID的某种同步服务。我想这取决于你对全球意义的定义。如果您使用的int3大于int32,并且您指的是给定网络上的全局,那么您可以使用附加了序列号的IP地址,其中序列号是跨进程同步生成的。

如果你有除IP地址之外的其他唯一标识符,那么这显然是作为网址一部分显示的更好选择。

答案 2 :(得分:0)

如果您使用的是.NET

,则可以使用RNGCryptoServiceProvider类

RNGCryptoServiceProvider Class