【问题标题】:Generate a unique number without database生成一个没有数据库的唯一编号
【发布时间】:2010-12-10 11:04:05
【问题描述】:

如何在没有数据库的情况下在c#中生成唯一编号?

(最多 17 位数字)。

编辑:仅限数字。

【问题讨论】:

  • 有多独特?当前流程的独特之处?机器?宇宙?
  • @Malachi:请记住,随机可能会产生两次相同的数字;所以不能保证是唯一的。
  • Date.Now.ToString("yyyyMMddHHmmssfff)?
  • @Bobby 如果您在一个时间间隔内生成多个数字(一个间隔通常为 1-16 毫秒,具体取决于您的计时器分辨率),则会失败
  • 为了好玩:MAC_address + DateTime.Now + RandomInt() + Your_Boss_Salary

标签: c# asp.net algorithm numbers uniqueidentifier


【解决方案1】:

您可以查看 Twitter 的开源 Snowflake project 以获得灵感,它解决了类似的问题。它是用 Scala 编写的,但简化版本在 C# 中编写代码非常简单。

前提是获取当前时间戳,并按位向左移动,留下右边的位可用于一个简单的序列号,每次时间戳递增时重置为0。

通过调整位长度并更改时间戳的粒度(例如,决定使用秒还是毫秒),您应该能够非常简单地生成适合 17 位数字的东西。

【讨论】:

    【解决方案2】:

    您可以使用 GUID,GUID(全局唯一标识符)是一个 128 位整数,可用于唯一标识某物。

    System.Guid.NewGuid()

    【讨论】:

    • 2^128 = 3.4*10^38 > 10^17 即您违反了 17 位要求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2017-04-06
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多