一种生成订单号的好算法

Jas*_*son 9 algorithm math

尽管我喜欢使用GUID作为我系统中的唯一标识符,但对于客户可能不得不向客户服务代表重复的订单号这样的字段来说,它不是非常用户友好.

什么是用于生成订单号的好算法,以便它是:

  • 独特
  • 不顺序(纯光学)
  • 仅限数字值(因此可以通过电话轻松读取CSR或键入)
  • <10位数
  • 可以在中间层生成而无需往返数据库.

更新(12/05/2009)在仔细检查每个发布的答案后,我们决定将中间层中的9位数字随机化,以保存在数据库中.在发生碰撞的情况下,我们将重新生成一个新数字.

Ale*_*lli 8

如果中间层无法检查数据库中是否已存在"订单号",那么它所能做的最好就相当于生成一个随机数.但是,如果您生成的约束小于10亿的随机数,您应该开始担心周围的意外碰撞sqrt(1 billion),即在以这种方式生成的几万个条目之后,碰撞的风险是重要的.如果订单号是连续的但是以伪装的方式,即一些模数为10亿的大质数的下一个倍数 - 会满足您的要求怎么办?


Jam*_*son 5

<Moan> OK听起来像是过早优化的经典案例.你能想象一个性能问题(噢,我的上帝,我要访问 - 恐怖! - 数据库以获取订单号码,我可能会很慢),并用伪随机生成的错综复杂的混乱和大量的重复处理代码结束< /呻吟>

一个简单的实际答案是为每个客户运行一个序列.实际订单号是客户编号和订单编号的组合.您可以轻松检索在重新查找有关客户的其他内容时使用的最后一个序列.

  • 大多数DBMS支持"序列"功能,大多数DBMS还支持子事务或特殊工作单元.只是让你的下一个序列超出正常的UOW - 你将最终得到序列中的空白,因为取消了UOWs中止的矿工等但这并不重要.你肯定没有竞争条件. (2认同)

Wil*_*ill 5

一种简单的选择是使用日期和时间,例如。0912012359,如果同一分钟收到两个订单,只需将第二个订单增加一分钟(时间到了没关系,只是一个订单号)。

如果您不希望日期可见,请将其计算为自固定时间点以来的分钟数,例如。当您开始接受订单或其他任意日期时。再次进行重复检查/增量。

您的竞争对手不会从中得到任何信息,而且很容易实施。