Rails 3:生成唯一代码(优惠券)
生成用作优惠券代码的唯一代码的最佳方法是什么?
谢谢。
你也可以这样做:
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
但是,您必须与数据库进行比较以确保它尚未使用。
从这里开始 。
在Ruby的标准库中有SecureRandom
:
SecureRandom.hex(3)
输出的长度是指定长度输入的两倍。
你想要的是生成一个GUID。 看这里:
ruby中的guid发生器
也许试试这个,似乎比仅仅生成一些随机密钥更有价值。 他们说:UUID生成器用于生成基于RFC 4122的通用唯一标识符(http://www.ietf.org/rfc/rfc4122.txt)。 http://rubygems.org/gems/uuid
gem install uuid cd /myproject/path uuid-setup
在你的代码中
require_gem 'uuid' my_unique_id_var = UUID.new
参考: http : //railsforum.com/viewtopic.php? id = 12616#p44545
如果你不想浪费与数据库的比较(不是一个超级昂贵的操作),你可以保证Time始终是唯一的,因为它只发生一次
md5(Time.now.to_i.to_s+Time.now.usec.to_s)
注意:有一个相同的问题
最近我写了优惠券代码gem ,完全一样。 该算法借鉴了Algorithm :: CouponCode CPAN模块。
优惠券代码不仅应该是唯一的,还应该易于阅读和打字,同时它仍然是安全的。 尼尔的解释和解决方案很棒。 这个gem提供了一种方便的方法和奖金validationfunction。
>> require 'coupon_code' >> code = CouponCode.generate => "1K7Q-CTFM-LMTC" >> CouponCode.validate(code) => "1K7Q-CTFM-LMTC" >> CouponCode.validate('1K7Q-CTFM-LMTO') # Invalid code => nil