3

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

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

这些能算Unique吗?

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

还有其他想法吗?

谢谢

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

4

3 回答 3

4

这取决于您需要它的独特性以及需要提供 ID 的项目数量。您最好的选择可能是按顺序分配它们;如果您尝试变得花哨,您可能会遇到生日悖论(碰撞的可能性比您预期的要大)或(如您的情况 1)上面)被迫限制您可以发布它们的速率。

在大多数情况下,您的 1) 比 2) 好一点;它的速率是有限的——你不能每次发出超过 1 个 ID——但不容易受到生日悖论的影响。你的 2) 只是扔掉一些东西。与随机数进行异或可能会稍微好一些,但无论如何我认为兰特不会给你买任何东西,只是隐藏问题并使其更难修复。

于 2009-04-13T14:39:42.503 回答
1

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

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

这两个选项都不是全球唯一的。

选项 1 - 仅当您可以保证每次报价不超过一个 ID 时,这才是唯一的。根据您的描述,这听起来并不可行。

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

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

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

于 2009-04-13T15:18:01.977 回答
0

如果您使用的是 .NET,则可以使用 RNGCryptoServiceProvider 类

RNGCryptoServiceProvider 类

于 2009-04-13T14:40:57.213 回答