7

注意:我已经阅读过较早的问题,例如客户编号、订单号的最佳格式是什么?,但是我的问题更具体一点。

生成伪随机数不久就会遇到“生日问题”。例如,如果我使用 27 位字段作为我的订单号,在 15000 次输入后,冲突的机会增加到 50%。

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

  • 预先生成整个集合并从中随机选择(几百 GB 的数据库)
  • 使用从特定种子编号开始的字典式“next_permutation”
  • 日期、用户 ID 等参数的 MD5 或 SHA-1 哈希,截断为 14 位
  • ETC

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

4

1 回答 1

5

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

年份只需要最后两位,可能只包括最后一位,具体取决于您保留订单记录的时间:通常 7 年左右就足够了,这意味着 2009 年的记录(以 9 开​​头)可以在 2018 年删除准备在 2019 年再次使用订单号。您可以将 mmdd 用于接下来的 4 位数字,或者简单地对一年中的天数进行编号并仅使用 3 位数字 - 这取决于您希望该数字对人类的友好程度。也可以只省略月份中的某一天并在每个月初重新开始序号,而不是每天。

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

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

于 2017-11-02T11:59:03.500 回答