2011-09-07 2 views
3

ActiveSupport::SecureRandom 클래스 \ 라이브러리에 관한 질문이 있습니다.ActiveSupport :: SecureRandom.hex 질문이 있으십니까? 레일 및 루비

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

나는 SecureRandom에 의해 생성 된 것과 같은 몇 가지 임의의 토큰이 필요할 수 있습니다 응용 프로그램을 쓰고 있어요.

이러한 토큰의 고유성은 어떻습니까? 이 토큰은 고유 한 특성입니까, 아니면 DB 열에 고유 한 제약 조건을 사용하는 것이 더 좋습니까?

감사합니다.

답변

3

링크 된 페이지에 유의하십시오.이 모듈은 인터페이스 (및 구현, 적어도 하나의 특정 버전의 경우)에서 http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom에있는 세부 정보를 찾을 수있는 페이지와 일치합니다.

이러한 호출 결과에는 고유 한 고유성이 없습니다. 물론, 시스템이 잘 뿌려지고 주장 된 의사 랜덤이라면 충돌 가능성은 조합기가 제안한만큼 작아야합니다. 이것은 "Birthday Paradox"이며 특히 충돌 가능성은 성공한 "Birthday Attack"(http://en.wikipedia.org/wiki/Birthday_attack)의 가능성에 해당하며 Wikipedia에 대한 자세한 내용을 찾을 수 있습니다. 실용적인 의사 난수가 엄격한 보장을 제공한다고 말할 수는 없지만 가깝다고 믿어집니다.

특별히 고유성이 필요한 경우 직접 적용해야합니다. 이것은 그렇게 쉬운 일이 아니며, 당신이 기대하는 조건을 달성하고 있음을주의해야합니다. 당신은 또한 당신이 모든 가능성을 다루고 있는지, 그리고 비교적 드문 경우에 - 중복 된 토큰을 생성한다면 그것을 처리 할 수 ​​있다는 것을 확신 할 필요가 있습니다.

4

당신은 ActiveSupport::SecureRandom이 (사용되지 않음) 사용 사용해서는 안 루비의 하나 : 당신은 그냥 완전히 독특한을 생성해야하는 경우 : 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 
관련 문제