Tom*_*man 14 ruby checksum e-commerce
我的在线商店中的每个订单都有一个面向用户的订单号.我想知道生成它们的最佳方法.标准包括:
现在我正在使用以下方法(没有校验和):
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订单提供空间.
在我的老地方,情况如下:
客户 ID(从 1001 开始)、他们下的订单的序列以及订单表中的唯一 ID。这给了我们一个至少 6 位数字的长数字,并且由于有两个主键,它是唯一的。
我想如果你在其中添加破折号或空格,你甚至可以让我们深入了解客户的购买习惯。这并不是令人难以置信的安全,我猜订单 ID 是可以猜到的,但我不确定这是否存在安全风险。
这是我在之前的问题中提出的系统的实现:
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)