代码之家  ›  专栏  ›  技术社区  ›  Jason

一种生成订单号的好算法

  •  9
  • Jason  · 技术社区  · 16 年前

    尽管我很喜欢使用guid作为系统中的唯一标识符,但对于订单号之类的字段(客户可能需要将其重复给客户服务代表),它不是非常用户友好的。

    生成订单号的一个好算法是什么?

    • 独特的
    • 不连续(纯粹用于光学)
    • 仅限数字值(因此可以通过电话或键入轻松地读取到CSR)
    • <10位数
    • 可以在中间层生成,而无需执行数据库的往返操作。

    更新(12/05/2009) 在仔细检查了所有发布的答案之后,我们决定在中间层随机化一个9位数的数字,保存在数据库中。如果发生碰撞,我们将重新生成一个新的数字。

    10 回复  |  直到 12 年前
        1
  •  8
  •   Alex Martelli    16 年前

    如果中间层不能检查数据库中已经存在什么“订单号”,那么它所能做的最好的工作就是生成一个随机数。但是,如果生成的随机数限制在10亿以下,那么应该开始担心周围的意外碰撞。 sqrt(1 billion) 也就是说,通过这种方式生成几万个条目后,发生碰撞的风险是实质性的。如果订单号是连续的,但是变相的,也就是说,某个大质数模10亿的下一个倍数——这能满足您的要求吗?

        2
  •  5
  •   James Anderson    16 年前

    <呜呜,好吧,听起来像是一个典型的过早优化案例。你可以想象一个性能问题(哦,天哪,我必须访问-恐怖-数据库才能获得订单号!我的可能会很慢),最后是一堆复杂的psuedo随机生成器和一大堆重复的处理代码。

    一个简单实用的答案是为每个客户运行一个序列。实际订单号是客户号和订单号的组合。您可以轻松检索检索有关客户的其他信息时使用的最后一个序列。

        3
  •  2
  •   Will    16 年前

    一个简单的选择是使用日期和时间,例如0912012359,如果在同一分钟内收到两个订单,只需将第二个订单增加一分钟(如果时间用完,这不重要,它只是一个订单号)。

    如果您不希望日期可见,则将其计算为固定时间点后的分钟数,例如,当您开始接受订单或其他任意日期时。同样,使用重复检查/增量。

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

        4
  •  1
  •   a_m0d    16 年前

    也许你可以尝试用马尔可夫链生成一些独特的文本-见 here 例如,在Python中实现。可能使用序列号(而不是随机的)来生成链,这样(希望)每个订单号都是唯一的。

    不过,只是个警告-看 here 因为如果你不小心你的设置可能会发生什么。

        5
  •  1
  •   momeara    16 年前

    一种解决方案是获取订单中某个字段的散列值。这不能保证它与所有其他订单的订单号都是唯一的,但是发生冲突的可能性非常低。我可以想象,如果不“往返数据库”,确保订单号是唯一的将是一个挑战。

    如果你不熟悉散列函数,维基百科页面是相当不错的。

        6
  •  1
  •   Joel Coehoorn    16 年前

    您可以base64编码一个guid。这将满足除“仅数值”要求之外的所有标准。

    但实际上 对的 这里要做的是让数据库生成订单号。这可能意味着创建一个订单 模板 在用户保存订单号之前实际上没有订单号的记录,或者它可能正在添加创建 空的 (但可能是未承诺的)命令。

        7
  •  1
  •   Luka Rahne    16 年前

    使用原始多项式作为有限域生成器。

        8
  •  1
  •   John    16 年前

    你的10位数要求是一个巨大的限制。考虑两阶段的方法。

    1. 使用GUID
    2. 在guid前面加上guid的10位(或5位或4位)散列。

    您将对哈希值进行多次点击。但没那么多。客户服务人员可以很容易地根据客户提供的附加信息确定有问题的订单。

        9
  •  0
  •   gary    16 年前

    对大多数要点的直接回答是:

    使前六位数字成为按顺序递增的字段,并将哈希的三位数字追加到末尾。或者七加二,或者八加一,这取决于你想象中需要支持的订单数量。

    但是,您仍然需要在后端调用一个函数来保留一个新的订单号;否则,就无法保证不会发生冲突,因为数字太少了。

        10
  •  0
  •   Josh    16 年前

    我们做TTT-CCCCC-1A-N1。

    • t=电路类型(d1e=ds1 eel,d1u=ds1 une等)
    • C=6位客户ID
    • 1=客户的第一个位置
    • A=该位置的第一个电路(A=1,B=2等)
    • N=订单类型(N=新,X=断开等)
    • 1=这种电路的第一阶