2012-08-22 20 views
4

注意:我已经阅读了诸如What is the best format for a customer number, order number?之类的旧问题,但是我的问题更具体些。亚马逊如何生成订单号码?

生成伪随机数不久就会遇到“生日问题”。例如,如果我使用27位字段作为我的订单号,则在15000个条目之后,碰撞机会增加到50%。

我想知道大的电子商务企业如亚马逊是否生成了订单编号以任何其他方式 - 例如:

  • 预先生成整个集合,并从中随机挑选(几百GB的数据库)
  • 使用辞书 “next_permutation” 从特定的种子数
  • MD5或SHA-1散列日期,用户ID的等参数开始,截断为14位数字

我想要的是一个非重复的整数(不需要非常随机,除了混淆总次数)某一宽度。关于如何实现这一点的任何想法?

+0

你问亚马逊如何做或如何做到这一点? – Blender

+0

对于你需要数学家和/或工程师这样大的东西,你不能指望在Q&A部分解决这样的问题。 – user827992

+0

“如果我使用27位字段作为我的订单号,则在15000个条目之后,碰撞的机会增加到50%。”使用更长的数字,然后... 27位甚至不是5个字符。 – Thilo

回答

1

建议从反向格式的日期开始,然后从1开始,然后是检查(或随机)数字。如果您每天可能不会超过100个订单,则需要添加两位数字加上检查/随机数字。

年份需要只包括最后两位数字,可能只有最后一位数字,具体取决于您保存订单的时间长度:7年左右通常就足够了,这意味着2009年的记录(从9开始)可能是在2018年删除,准备在2019年再次使用订单号码。您可以在接下来的4位数字中使用mmdd,或者简单地在年份中使用数字并仅使用3位数字 - 这取决于您希望数字的人性化程度。也有可能只是在每个月的开始时间而不是每天重新开始一个月的日期并重新开始连续的数字。

今天是2017年十一月2日,假设这是16号订单今天,您的订单号将是71102168(其中8是一个校验数字或随机数字)。如果您可能达到但不超过一千,那么您需要额外的数字,因此:711020168.为了避免限制自己的数字位数,您可能更喜欢使用连字符:71102-168 ...您如果您愿意,可以在检查/随机数字前加上另一个连字符:71102-16-8。

如果您有几个处理订单的区域,您可能希望包含一个仓库编号,可能是在开始或之后,允许您在每个仓库使用序列号 - 例如仓库5可能是:5- 71102-168,71102-5-168或711025168.同样,如果您不使用连字符,则需要评估是否需要多达十个,一百个或上千个(等)可能的仓库编号。我希望这有帮助!