2011-02-25 6 views
3

나는 pastebin app을 만들고 있는데, 붙여 넣기의 ID를 정말로 무작위로 만들고 싶습니다. Linux (Linux 컴퓨터에서 호스트 됨)의 /dev/random은 노이즈를 사용하므로 실제로 출력이 무작위입니다.Linux의 Ruby는/dev/random을 사용합니까?

현재 나는 ID를 생성하는 코드를 사용

self.guid = Digest::SHA1.hexdigest(Time.new.to_s + (0...50).map{ ('a'..'z').to_a[rand(26)] }.join) 

합니까 루비의 rand 기능을 사용 /dev/random을, 그리고 어떻게 루비에서 /dev/random을 사용할 수 있습니다하지 않을 경우? 감사.

답변

12

거의 documented의 SecureRandom (루비 1.9.2 표준 lib 디렉토리),은 OpenSSL을 (urandom을보다 빠릅니다하는)를 사용, Win32에서의 임의 사용할 수 경우는 검사 지속됩니다. 그렇지 않으면 오류가 발생합니다. 그것은 좋은 기능이 있습니다

require 'securerandom' 
puts SecureRandom.urlsafe_base64(50) 
#=> thgv48AT_gGcYD3xx-lCqRWjoAFqN3pm2ZBKOZPZP2BC0aSMD5rXg1EaPzKLbJMMt4Y 
puts SecureRandom.uuid 
#=> 2670f82a-0aee-41a8-93c5-2d08e2c608db 

(uuid: RFC 4122)

+0

이 최고입니다. : D –

+0

+1 멋진! SecureRandom 클래스를 지적 해 주셔서 감사합니다. – maerics

+0

[/ dev/random은 /dev/urandom](http://linux.die.net/man/4/urandom)이 아닙니다. –

3

아니요, the documentation에는 임의의 장치가 아니라 소프트웨어 솔루션을 의미하는 Mersenne 트위스터가 나와 있습니다.

그러나 은 사용중인 Ruby 버전 및 컴파일 방법에 따라 시드 (seeding) 할 장치를 사용합니다. ruby-1.9.2-p0 소스의 빠른 grep은 /dev/urandom (아마도 OpenSolaris 용)에 대한 몇 가지 참조를 보여줍니다.이 장치는 USE_DEV_URANDOM 매크로가 정의 된 경우 해당 장치가 시드에 사용되는 것처럼 보입니다.

정말 임의성이 필요한 경우 /dev/random에서 직접 읽는 것이 좋습니다. This SO question을 시작해야합니다. 이 urandom의 사용을 사용할 수없는 경우