我想在不使用GUID的情况下获得关于生成唯一ID的一些想法。最好我希望唯一值是int32类型。
我正在寻找可以用于数据库主键以及网址友好的东西。
这些可以被视为独特吗?
(int)DateTime.Now.Ticks
(int)DateTime.Now * RandomNumber
还有其他想法吗?
由于
编辑:我正在尝试练习域驱动设计,我的所有实体在创建时都需要有一个ID才有效。理论上我可以调用DB来获得一个自动递增的数字,但是当DB相关的东西进入域时,我宁愿避开这个。答案 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类