ActiveSupport::SecureRandom.hex вопрос? Рельсы и Руби

У меня есть вопрос относительно ActiveSupport::SecureRandom класса\библиотеки.

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

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

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

Спасибо!


person Jasdeep Singh    schedule 07.09.2011    source источник


Ответы (2)


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

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

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

person Ming    schedule 07.09.2011

Вы не должны использовать ActiveSupport::SecureRandom (устарело), ​​используйте Ruby: 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
person a.s.t.r.o    schedule 17.12.2012