Ruby 为在线商店生成订单号的最佳方法?
我的在线商店中的每个订单都有一个面向用户的订单号。我想知道生成它们的最佳方法。标准包括:Ruby 为在线商店生成订单号的最佳方法?,ruby,e-commerce,checksum,Ruby,E Commerce,Checksum,我的在线商店中的每个订单都有一个面向用户的订单号。我想知道生成它们的最佳方法。标准包括: 短 通过电话很容易说(例如,“m”和“n”不明确) 独特的 校验和(过杀?有用吗?) 编辑:不会显示总共有多少订单(客户可能会发现您的第三次订单令人不安) 现在我使用以下方法(无校验和): 按顺序,从1开始?怎么了 (注意:这个答案是在OP编辑问题之前给出的。)在我的老地方,答案如下: 客户ID(从1001开始)、订单顺序,然后是订单表中的唯一ID。这给了我们一个非常长的数字,至少有6个数字,它是唯一的
- 短
- 通过电话很容易说(例如,“m”和“n”不明确)
- 独特的
- 校验和(过杀?有用吗?)
- 编辑:不会显示总共有多少订单(客户可能会发现您的第三次订单令人不安)
按顺序,从1开始?怎么了
(注意:这个答案是在OP编辑问题之前给出的。)在我的老地方,答案如下: 客户ID(从1001开始)、订单顺序,然后是订单表中的唯一ID。这给了我们一个非常长的数字,至少有6个数字,它是唯一的,因为有两个主键
我想如果你在上面加上破折号或空格,你甚至可以让我们对客户的购买习惯有一点了解。安全性令人难以置信,我想订单ID是可以猜到的,但我不确定是否存在安全风险。好的,这个怎么样 按顺序,从某个数字(2468)开始,再加上另一个数字,比如下订单的月份 这个数字一直在增加(直到你超过整数类型的容量,但到那时你可能不在乎了,因为你将获得难以置信的成功,并将在某个遥远的岛屿天堂啜饮玛格丽塔酒)。它的实现非常简单,而且它混合了足够多的东西,可以让人不去猜测您有多少订单。类似这样的东西:
获取以毫秒为单位的当前时间并将其用作您的订单ID如何?只需一个Rube Goldberg风格的想法: 您可以生成一个表,其中包含一组与随机时间段相关的随机数字:
Time Period Interleaver
next 2 weeks: 442
following 8 days: 142
following 3 weeks: 580
等等。。。这给了你无限数量的交织器,并且不会让任何人知道你的订单率,因为你的时间段可能是几天,你的交织器正在为你做很多低技术的“混搭”
您可以生成此表一次,只需确保所有交织器都是唯一的。
您可以通过简单地向集合中添加更多字符,或者从定义更长的交织器开始,确保交织器不会用完
因此,通过获取序列号并使用今天的交织器值,在每个序列号的数字之间交织其数字(因此,名称),生成订单ID。保证唯一-保证混乱
示例:
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仅比交织器长一位数时除外)
我没有说这是最好的方式——只是一个星期五的主意。我宁愿提交347号,并在一个较小的个人网站上获得良好的客户服务,而不是在大型网站上的G-84e38wRD-45OM,并被忽略一周
您不希望将其作为系统id或链接的一部分,但作为一个用户友好的号码,它可以工作。作为客户,我很乐意:
year-month-day/short_uid
例如:
2009-07-27/KT1E
它为每天大约33^4~1mln的订单提供了空间。以下是system I的一个实现:
你可以像邮政编码一样: 2b2 b2b 这样它就有了某种校验和(不是真的,但至少你知道如果有两个连续的数字或字母,它是错的)。它很容易通过电话读出,而且不显示系统中有多少订单。
您可以尝试创建不会显示系统中订单数量的加密版本,而不是生成和存储数字。道格拉斯·克罗克福德(Douglas Crockford)的Base32编码在这方面非常有效 将ID本身作为一个自动递增的整数存储在数据库中,从适当的大值(如100000)开始,然后将编码值公开给客户/接口
5个字符将帮助您完成第一批约3200万份订单,同时表现出色并满足大多数要求。但它不允许排除类似发音的字符。请参阅我的编辑--我不想向客户透露我的商店有多新。按顺序,从1234开始?;)客户或更重要的是,竞争对手可以看到您在一段时间内的订单处理情况。按顺序,从1开始对该数字进行哈希运算?您在面包店拿到47号,并假设您是第47位客户?不要想得太多。记住,他们在购买后会看到数字。这在一段时间内是可以的,但是在你有很多(真的,真的很多)订单之后,生成唯一id的机会会越来越低。。。我想我会提交的
2009-07-27/KT1E
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
1: 302841629
2: 571277085
3: 34406173
4: 973930269
5: 437059357
6: 705494813
7: 168623901
8: 906821405
9: 369950493
10: 638385949
>> rand(36**8).to_s(36)
=> "uur0cj2h"