为在线商店生成订单号的最佳方法?

Tom*_*man 14 ruby checksum e-commerce

我的在线商店中的每个订单都有一个面向用户的订单号.我想知道生成它们的最佳方法.标准包括:

  • 很容易通过电话说(例如,"m"和"n"是模棱两可的)
  • 独特
  • 校验和(矫枉过正?有用吗?)
  • 编辑:不显示已经有多少总订单(客户可能会发现您的第三个订单令人不安)

现在我正在使用以下方法(没有校验和):

def generate_number                
    possible_values = 'abfhijlqrstuxy'.upcase.split('') | '123456789'.split('')

    record = true
    while record
        random = Array.new(5){possible_values[rand(possible_values.size)]}.join
        record = Order.find(:first, :conditions => ["number = ?", random])
    end          
    self.number = random
end
Run Code Online (Sandbox Code Playgroud)

nit*_*ria 14

作为客户,我很满意:

year-month-day/short_uid
Run Code Online (Sandbox Code Playgroud)

例如:

2009-07-27/KT1E
Run Code Online (Sandbox Code Playgroud)

它为每天约33 ^ 4~1mln订单提供空间.

  • 没有追踪'2',年份和4个随机字符(例如9-256-KT1E)的年份足以在999年内每天完成100万个订单,这是怎么回事? (4认同)
  • 这并不能回答问题。它告诉您*订单号可能是什么样子*,但完全没有说明如何生成它(这很重要,因为您的 Short_uid 中存在冲突)。 (4认同)
  • 这是一个非常好的方法,以及在ID本身内扫描购买日期的订单号.我会选择更加模糊,更像零售代码,并删除令牌,只需:20090727KT1E. (2认同)

MrC*_*ter 5

在我的老地方,情况如下:

客户 ID(从 1001 开始)、他们下的订单的序列以及订单表中的唯一 ID。这给了我们一个至少 6 位数字的长数字,并且由于有两个主键,它是唯一的。

我想如果你在其中添加破折号或空格,你甚至可以让我们深入了解客户的购买习惯。这并不是令人难以置信的安全,我猜订单 ID 是可以猜到的,但我不确定这是否存在安全风险。


Pes*_*sto 5

这是我在之前的问题中提出的系统的实现:

MAGIC = [];
29.downto(0) {|i| MAGIC << 839712541[i]}

def convert(num)
  order = 0
  0.upto(MAGIC.length - 1)  {|i| order = order << 1 | (num[i] ^ MAGIC[i]) }
  order
end
Run Code Online (Sandbox Code Playgroud)

它只是一个廉价的散列函数,但它使普通用户很难确定已处理的订单数量,或者另一个订单的数量。在您完成 2 30 个订单之前,它不会用完空间,您不会很快完成订单。

以下是convert(x)1 到 10的结果:

1:  302841629
2:  571277085
3:   34406173
4:  973930269
5:  437059357
6:  705494813
7:  168623901
8:  906821405
9:  369950493
10: 638385949
Run Code Online (Sandbox Code Playgroud)