プログラムを書いているとパスワードや推測しにくいIDなどに利用する用途でランダムな文字列を生成したい事がある。
Ruby では SecureRandom というモジュールを利用することでランダムな文字列を生成できる。SecureRandom は標準で利用できるのでスクリプト内で require 'securerandom' と読み込むだけで手軽に扱う事ができる。
$ ruby --version
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]
$ irb
> require 'securerandom'
=> true
どのような文字列が生成できるのか順に見ていこう。
SecureRandom.alphanumeric
ランダムな英数字を生成する。利用される文字の範囲は A-Z, a-z, 0-9 の合計62種類。
> SecureRandom.alphanumeric(10)
=> "kgB4J3YIaZ" # ランダムな10文字の文字列
> SecureRandom.alphanumeric()
=> "DQTDxnGA9snO2p1O" # 何も指定しなかったら16文字
SecureRandom.base64
ランダムな Base64 文字列を生成する。生成された文字列の長さは指定した数値のおよそ 4/3 倍となる。
> SecureRandom.base64(10)
=> "bNerswht86v73w=="
> SecureRandom.base64()
=> "5k5gX0QqLE4XP6ZVxCPbeg=="
URL-safe な base64 文字列を生成する urlsafe_base64 も用意されている。
> SecureRandom.urlsafe_base64(10)
=> "VCImyjTyVhYy1w"
> SecureRandom.urlsafe_base64()
=> "NnXqALN9_KOhwctftmKiWg"
SecureRandom.hex
ランダムな16進数文字列を生成する。利用される文字の範囲は 0-9, a-f の16種類。
> SecureRandom.hex(10)
=> "0a5eca531158bd4092c0"
> SecureRandom.hex()
=> "b833bf749fcdc3a4198378b23569ca8a"
引数に指定する数値は文字数ではなくランダムネスのサイズとなる。hex の場合文字列の長さは指定した数値の二倍となる。
SecureRandom.random_bytes
ランダムなバイト文字列を生成する。
> SecureRandom.random_bytes(10)
=> "\xAA\r\xA3\x14i\xDD=\xDF\x884"
> SecureRandom.random_bytes
=> "|\xFE\x86\"\xC5\xD3\x15}\xA0\xC6\x1F\x84\v5:\xFE"
SecureRandom.uuid
UUID 形式のランダムな文字列を生成する。uuid だけは文字列の長さを指定できない。
> SecureRandom.uuid
=> "f4379f94-b5b6-4ba5-a4ea-078f8dfc3402"
UUID についての解説は Wikipedia 見るのが良い。簡単にいうと 128 ビットによる数値で16進数で xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx といった感じで表す。
いくつかバージョンがわかれているが SecureRandom.uuid ではバージョン 4 を利用している。
コメント