ActiveSupport :: SecureRandom.hex вопрос?Rails и Ruby - PullRequest
3 голосов
/ 07 сентября 2011

У меня вопрос по поводу ActiveSupport::SecureRandom class \ library.

http://apidock.com/rails/ActiveSupport/SecureRandom

Я пишу приложение, которому могут понадобиться некоторые случайные токены, подобные сгенерированным SecureRandom.

А как насчет уникальности этих токенов?Являются ли эти токены уникальными по своей природе или мне лучше использовать ограничение уникальности для моей колонки БД?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 17 декабря 2012

Вы не должны использовать ActiveSupport::SecureRandom (устарело), ​​используйте Ruby's: SecureRandom

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

before_create :generate_uid

def generate_uid
    begin
        uid = SecureRandom.hex(12)
    end while SomeModel.where(:uid => uid).exists?
    self.uid = uid
end
4 голосов
/ 07 сентября 2011

Обратите внимание на страницу, на которую вы ссылались, на которой написано, что этот модуль соответствует интерфейсу (и реализации, по крайней мере, в случае одной конкретной версии) тому, что находится на http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom, где вы можете найти более подробную информацию.

В результатах таких вызовов нет уникальности. Конечно, учитывая, что система хорошо засеяна и является псевдослучайной, как утверждается, вероятность столкновений должна быть такой же маленькой, как это было предложено комбинаторикой. Это «парадокс дня рождения», и, в частности, шансы на столкновение соответствуют шансам успешной «атаки на день рождения» (http://en.wikipedia.org/wiki/Birthday_attack), и вы можете найти более подробную информацию в Википедии. Нельзя сказать, что практическая псевдослучайность дает строгие гарантии, но, как полагают, она подходит близко.

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

...