Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为在线商店生成订单号的最佳方法?_Ruby_E Commerce_Checksum - Fatal编程技术网

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)开始,再加上另一个数字,比如下订单的月份

这个数字一直在增加(直到你超过整数类型的容量,但到那时你可能不在乎了,因为你将获得难以置信的成功,并将在某个遥远的岛屿天堂啜饮玛格丽塔酒)。它的实现非常简单,而且它混合了足够多的东西,可以让人不去猜测您有多少订单。

类似这样的东西:

  • 获取顺序订单号。或者,一个UNIX时间戳加上两个或三个随机数字(当两个订单同时下达时)也可以
  • 将其与某些半秘密值进行位异或,使数字显示为“伪随机”。这很简单,不会阻止那些真正想调查你有多少订单的人,但为了真正的“随机性”,你需要保留一个(大的)排列表。或者你需要有大的随机数,这样你就不会受到生日悖论的影响
  • 使用添加checkdigit(我不确定base33的属性是否会这么好,但应该不会太差)
  • 将数字转换为(例如)基数33(“0-9A-Z”,除了“O”、“Q”和“L”,它们可能被误认为“0”和“1”)或类似的数字。发音容易意味着排除更多的字母
  • 将结果分组为一些直观可读的模式,如XXX-XXX-XX,这样用户就不必用手指或鼠标指针跟踪位置

  • 获取以毫秒为单位的当前时间并将其用作您的订单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"