Как создать уникальный шестизначный буквенно-цифровой код в Ruby - PullRequest
5 голосов
/ 06 мая 2011

Мне нужно сгенерировать уникальный шестизначный буквенно-цифровой код.Сохранить в моей базе данных как ваучер №: для каждой транзакции.

Ответы [ 6 ]

3 голосов
/ 06 мая 2011

Я использовал это

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

Как создать случайную строку в Ruby Эта ссылка была полезной

0 голосов
/ 10 марта 2012

Это может повысить проблему столкновения во времени, получив миллисекунды

(Time.now.to_f*1000.0).to_i
0 голосов
/ 06 мая 2011
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
0 голосов
/ 06 мая 2011

Со следующими ограничениями:

  1. Действительно только до 2038-12-24 00:40:35 UTC
  2. Генерирует не более одного раза в секунду

Вы можете использовать этот простой код:

Time.now.to_i.to_s(36)
# => "lks3bn"
0 голосов
/ 06 мая 2011

Я бы использовал базу данных для генерации уникальных ключей, но если вы настаиваете на том, чтобы делать это трудным путем:

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")

Конечно, вам придется где-то хранить свой текущий ключ, и этони в коем случае не является многопоточным и т.д.

0 голосов
/ 06 мая 2011

Лучший способ - позволить базе данных обрабатывать идентификаторы (с приращением).Но если вы настаиваете на том, чтобы генерировать их самостоятельно, вы можете использовать генератор случайных чисел для генерации кода, сравните его с db на уникальность.затем либо принять, либо восстановить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...