如何在Ruby中生成唯一的六位字母数字代码

时间:2011-05-06 10:41:16

标签: ruby alphanumeric

我需要生成一个独特的六位数字数字代码。要在我的数据库中保存为凭证号码:对于每笔交易。

6 个答案:

答案 0 :(得分:3)

我用过这个

  require 'sha1'
  srand
  seed = "--#{rand(10000)}--#{Time.now}--"
  Digest::SHA1.hexdigest(seed)[0,6]

How to generate a random string in Ruby此链接很有用

答案 1 :(得分:0)

更好的方法是让数据库处理id(递增)。但是如果你坚持自己生成它们,你可以使用随机生成器来生成代码,针对db检查它的唯一性。然后接受或重新生成

答案 2 :(得分:0)

我会使用数据库生成唯一的密钥,但是如果你坚持这么做的话:

class AlnumKey

  def initialize
    @chars = ('0' .. '9').to_a + ('a' .. 'z').to_a
  end

  def to_int(key)
    i = 0
    key.each_char do |ch|
      i = i * @chars.length + @chars.index(ch)
    end
    i
  end

  def to_key(i)
    s = ""
    while i > 0 
      s += @chars[i % @chars.length]
      i /= @chars.length
    end
    s.reverse 
  end

  def next_key(last_key)
    to_key(to_int(last_key) + 1) 
  end
end

al = AlnumKey.new
puts al.next_key("ab")
puts al.next_key("1")
puts al.next_key("zz")

当然,你必须将你当前的密钥存储在某个地方,这绝不是线程/多会话安全等。

答案 3 :(得分:0)

具有以下限制:

  1. 有效期至2038-12-24 00:40:35 UTC
  2. 在一秒内生成不超过一次
  3. 你可以使用这个简单的代码:

    Time.now.to_i.to_s(36)
    # => "lks3bn"
    

答案 4 :(得分:0)

class IDSequence
  attr_reader :current
  def initialize(start=0,digits=6,base=36)
    @id, @chars, @base = start, digits, base
  end
  def next
    s = (@id+=1).to_s(@base)
    @current = "0"*(@chars-s.length) << s
  end
end

id = IDSequence.new
1234.times{ id.next }

puts id.current
#=> 0000ya

puts id.next
#=> 0000yb

9876543.times{ id.next }
puts id.current
#=> 05vpqq

答案 5 :(得分:0)

这可以通过获取毫秒来缓解时间冲突问题

(Time.now.to_f*1000.0).to_i