Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 on rails Rails 3:生成唯一代码(优惠券)_Ruby On Rails_Ruby_Rubygems_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails Rails 3:生成唯一代码(优惠券)

Ruby on rails Rails 3:生成唯一代码(优惠券),ruby-on-rails,ruby,rubygems,ruby-on-rails-3,Ruby On Rails,Ruby,Rubygems,Ruby On Rails 3,生成用作优惠券代码的唯一代码的最佳方法是什么 谢谢。您想要的是生成一个GUID。请看这里: 您也可以这样做: chars = ('a'..'z').to_a + ('A'..'Z').to_a def String.random_alphanumeric(size=16) (0...size).collect { chars[Kernel.rand(chars.length)] }.join end 但是,您必须与数据库进行比较,以确保它尚未被使用。也许可以尝试一下,这似乎比生成一些随

生成用作优惠券代码的唯一代码的最佳方法是什么


谢谢。

您想要的是生成一个GUID。请看这里:


您也可以这样做:

chars = ('a'..'z').to_a + ('A'..'Z').to_a
def String.random_alphanumeric(size=16)
    (0...size).collect { chars[Kernel.rand(chars.length)] }.join
end

但是,您必须与数据库进行比较,以确保它尚未被使用。

也许可以尝试一下,这似乎比生成一些随机密钥更能证明这一点。 他们说:UUID生成器用于基于RFC4122生成通用唯一标识符(http://www.ietf.org/rfc/rfc4122.txt).

在代码中

require_gem 'uuid'
my_unique_id_var = UUID.new

参考资料:

如果您不想浪费时间与数据库进行比较(这不是一个非常昂贵的操作),您可以保证时间总是唯一的,因为它只发生一次

md5(Time.now.to_i.to_s+Time.now.usec.to_s)

在Ruby的标准库中,有
SecureRandom
用于:

SecureRandom.hex(3)
输出的长度是输入指定长度的两倍。

注意:有

最近我写了一篇文章,做了完全相同的事情。该算法借用了algorithm::CouponCode CPAN模块

优惠券代码不仅应该是唯一的,而且应该在安全的情况下易于阅读和键入。Neil的解释和解决方案很棒。这个gem提供了一个方便的方法和一个额外的验证功能

>需要“优惠券\u代码”
>>代码=CouponCode.generate
=>“1K7Q-CTFM-LMTC”
>>CouponCode.validate(代码)
=>“1K7Q-CTFM-LMTC”
>>耦合代码。验证('1K7Q-CTFM-LMTO')#无效代码
=>零

说出他们的名字?我的意思是,有些人必须了解优惠券及其作用。让他们提供一个名字。请确保以前没有使用过该名称。@codethis可能重复:我想要的是更多像groupon一样的优惠券代码。当你从groupon购买东西时,你会得到一个代码来兑换服务。我相信基本上是随机数字和字母,但没有两个代码是相同的。它可以是任意多的。尚未定义。这就是GUID的含义-只需从生成的stringQuestion asks for Ruby/Rails解决方案中去掉
-
。实现并更改-我在问题和问题之间感到困惑(看起来仍然不像Ruby;)将第一行替换为
chars=('A'..'Z')。至_A
。如果您想要数字和大写字母do
chars=(0..9).to_a+('a'..'Z').to_a
您应该使用
ActiveSupport::SecureRandom
来实现这一点,而不是编码您自己的功能。+1是为了考虑安全性。一个能够猜测或生成有效优惠券代码的用户可能会很烦人,甚至很糟糕。OP不仅需要关注随机数生成器的加密强度,还需要关注“密钥空间”的大小与可能发行的优惠券数量之间的比率。这个比率越低,人们就越有可能随机猜测优惠券代码。从rails 3.2开始删除-使用stdlib中的简单SecureRandom。请参阅更新的答案以反映这一点。我喜欢这一个,尽管SHA2会更安全(但速度较慢)。除非您将其与用户名或id配对,否则您将面临竞争条件的风险-两个进程为不同的用户生成相同的时间/优惠券代码。这将是罕见的,但可能和非常难以调试。请尝试使用
md5(当前用户id.to\u s+时间.now.to\u i.to\u s+时间.now.usec.to\u s)
。时间不是唯一的。参见夏令时;一年一次,你可以得到一整小时的重复时间。然后是能够改变系统时钟的问题。使用GUID/UIID
SecureRandom.hex(3)