我的在线商店中的每个订单都有一个面向用户的订单号。我想知道生成它们的最佳方法。标准包括:
现在我正在使用以下方法(没有校验和):
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
答案 0 :(得分:14)
作为客户,我很满意:
year-month-day/short_uid
例如:
2009-07-27/KT1E
每天约有33 ^ 4~1个月的订单。
答案 1 :(得分:3)
以下是系统I proposed in an earlier question的实现:
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
这只是一个廉价的哈希函数,但它使普通用户难以确定已处理的订单数量,或另一个订单的数量。在你完成2次 30 订单之前,它不会用完空间,你很快就不会打到它。
以下是1到10的convert(x)
的结果:
1: 302841629
2: 571277085
3: 34406173
4: 973930269
5: 437059357
6: 705494813
7: 168623901
8: 906821405
9: 369950493
10: 638385949
答案 2 :(得分:2)
在我原来的地方是以下内容:
客户ID(从1001开始),它们所订单的顺序,然后是Orders表中的唯一ID。这给了我们一个很好的长数至少6位数,由于两个主键,它是唯一的。
我想如果你在其中添加破折号或空格,甚至可以让我们对客户的购买习惯有所了解。它不是令人难以置信的安全,我想订单ID是可以猜到的,但我不确定是否存在安全风险。
答案 3 :(得分:2)
您可以尝试创建一个不会显示系统中订单数量的加密版本,而不是生成和存储数字。 Here's an article就是这样。
答案 4 :(得分:1)
这样的事情:
答案 5 :(得分:1)
我宁愿提交数字347并在一个规模较小的网站上获得优质的客户服务:G-84e38wRD-45OM在大型网站上被忽略一周。
您不希望将此作为系统ID或链接的一部分,但作为一个用户友好的数字,它可以工作。
答案 6 :(得分:1)
http://www.crockford.com/wrmg/base32.html
将ID本身作为自动递增的整数存储在数据库中,从大小为100000的大小开始,只需将编码值公开给客户/接口。
5个字符将通过您的第一个~3200万个订单看到您,同时表现非常好并满足大部分这些要求。但它并不允许排除类似的发声角色。
答案 7 :(得分:0)
顺序,从1开始?这有什么问题?
(注意:这个答案是在OP编辑问题之前给出的。)
答案 8 :(得分:0)
好的,这个怎么样?
顺序地,从某个数字(2468)开始并添加一些其他数字,比如下订单的当天。
这个数字总是会增加(直到你超过整数类型的容量,但到那时你可能不在乎,因为你会非常成功,并且会在一些遥远的岛屿天堂里啜饮玛格丽塔酒)。它实现起来非常简单,它可以将事情混合起来,以避免猜测你有多少订单。
答案 9 :(得分:0)
只有一个Rube Goldberg风格的想法:
您可以生成一个包含随机时间段的随机数字组的表格:
Time Period Interleaver
next 2 weeks: 442
following 8 days: 142
following 3 weeks: 580
依此类推......这为你提供了无限数量的Interleavers,并且不会让任何人知道你的订单率,因为你的时间段可能是几天而且你的交织器做了很多低 - 科技为你“捣碎”。
您可以生成此表一次,并确保所有Interleavers都是唯一的。 您可以通过简单地在集合中添加更多字符来确保不会耗尽Interleavers,或者通过定义更长的Interleavers来开始。
因此,您通过获取序列号生成订单ID,并使用今天的Interleaver值,在每个序号的数字之间交错其数字(因此,名称)。保证独特 - 保证令人困惑。
示例强>:
Today I have a sequential number 1, so I will generate the order ID: 4412
The next order will be 4422
The next order will be 4432
The 10th order will be 41402
In two weeks my interleaver will change to 142,
The 200th order will be 210402
The 201th order will be 210412
Eight days later, my interleaver changes to 580:
The 292th order will be 259820
这将完全令人困惑但完全确定。您可以从1的位置开始删除所有其他数字。 (除非您的订单ID只比交织器长一位数)
我没有说这是最好的方式 - 只是星期五的想法。
答案 10 :(得分:0)
你可以像邮政编码那样做: 2b2 b2b
这样它有某种校验和(不是真的,但至少你知道如果有2个连续的数字或字母则错了)。它很容易通过电话读出,也没有说明系统中有多少订单。
答案 11 :(得分:0)
http://blog.logeek.fr/2009/7/2/creating-small-unique-tokens-in-ruby
>> rand(36**8).to_s(36)
=> "uur0cj2h"
答案 12 :(得分:-2)
如何以毫秒为单位获取当前时间并将其用作订单ID?