5

一意の6桁の英数字コードを生成する必要があります。データベースにバウチャー番号として保存するには:すべてのトランザクションに対して。

4

6 に答える 6

3

これを使った

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

Rubyでランダムな文字列を生成する方法 このリンクは役に立ちました

于 2011-05-06T11:18:02.697 に答える
0

次の制限があります。

  1. 2038-12-2400:40:35UTCまでのみ有効
  2. 1秒間に1回しか生成されません

この単純なコードを使用できます。

Time.now.to_i.to_s(36)
# => "lks3bn"
于 2011-05-06T14:46:04.127 に答える
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
于 2011-05-06T17:08:43.300 に答える
0

より良い方法は、データベースにID(インクリメント)を処理させることです。ただし、自分で生成することを主張する場合は、ランダムジェネレーターを使用してコードを生成し、dbと照合して一意性を確認できます。次に、受け入れるか再生成します

于 2011-05-06T10:58:26.840 に答える
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")

もちろん、現在のキーをどこかに保存する必要がありますが、これはスレッド/マルチセッションセーフなどではありません。

于 2011-05-06T11:01:35.587 に答える
0

これにより、ミリ秒を取得することで時間の衝突の問題が軽減されます

(Time.now.to_f*1000.0).to_i
于 2012-03-10T08:08:06.583 に答える