Rails 3: генерация уникальных кодов (купонов) - PullRequest
16 голосов
/ 30 декабря 2010

Какой лучший способ создания уникальных кодов для использования в качестве кодов купонов?

Спасибо.

Ответы [ 6 ]

37 голосов
/ 30 декабря 2010

В стандартной библиотеке Ruby для этого есть SecureRandom:

SecureRandom.hex(3)

Длина вывода в два раза больше указанной длины ввода.

7 голосов
/ 30 декабря 2010

То, что вы хотите, это сгенерировать GUID.Смотрите здесь:

генератор направляющих в ruby ​​

4 голосов
/ 30 декабря 2010

Может быть, попробовать это, кажется, больше доказательств, чем просто генерация случайного ключа. Они говорят: 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

3 голосов
/ 30 декабря 2010

Вы также можете сделать что-то подобное:

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

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

С здесь.

2 голосов
/ 30 декабря 2010

Если вы не хотите тратить впустую сравнение с базой данных (не очень дорогая операция), вы можете гарантировать, что Time всегда уникально, потому что оно происходит только один раз

md5(Time.now.to_i.to_s+Time.now.usec.to_s)
1 голос
/ 22 декабря 2014

Примечание: есть тот же вопрос

Недавно я написал gem купонного кода , который делает то же самое.Алгоритм заимствован из CPAN-модуля Algorithm :: CouponCode.

Код купона должен быть не только уникальным, но также легко читаемым и набираемым, пока он еще безопасен.Объяснение и решение Нила великолепны.Этот драгоценный камень предоставляет удобный способ сделать это и функцию проверки бонуса.

>> require 'coupon_code'
>> code = CouponCode.generate
=> "1K7Q-CTFM-LMTC"
>> CouponCode.validate(code)
=> "1K7Q-CTFM-LMTC"
>> CouponCode.validate('1K7Q-CTFM-LMTO') # Invalid code
=> nil
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...